home *** CD-ROM | disk | FTP | other *** search
/ Mac Format 1994 October / Macformat17.cdr / Shareware City / Developers / xlispmac / XLisp Docs < prev   
Text File  |  1994-05-28  |  235KB  |  5,746 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.                   XLISP-PLUS: Another Object-oriented Lisp
  17.  
  18.                                 Version 2.1g
  19.  
  20.                                 May 27, 1994
  21.  
  22.                                   Tom Almy
  23.                               tom.almy@tek.com
  24.  
  25.  
  26. Portions of  this manual and software are from XLISP which is Copyright (c)
  27. 1988,  by  David  Michael  Betz,  all  rights  reserved.  Mr.  Betz  grants
  28. permission for unrestricted non-commercial use. Portions of XLISP-PLUS from
  29. XLISP-STAT are Copyright (c) 1988, Luke Tierney. UNIXSTUF.C is from Winterp
  30. 1.0,  Copyright  1989  Hewlett-Packard  Company  (by  Niels  Mayer).  Other
  31. enhancements  and bug fixes are  provided without restriction  by Tom Almy,
  32. Mikael  Pettersson,  Neal  Holtz,  Johnny Greenblatt,  Ken  Whedbee,  Blake
  33. McBride, Pete Yadlowsky, and Richard Zidlicky. See source code for details.
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40. Table of Contents
  41.  
  42. INTRODUCTION  . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   1
  43.  
  44. XLISP COMMAND LOOP  . . . . . . . . . . . . . . . . . . . . . . . . . .   2
  45.  
  46. BREAK COMMAND LOOP  . . . . . . . . . . . . . . . . . . . . . . . . . .   4
  47.  
  48. DATA TYPES  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   5
  49.  
  50. THE EVALUATOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   7
  51.  
  52. HOOK FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . . . . . .   8
  53.  
  54. LEXICAL CONVENTIONS . . . . . . . . . . . . . . . . . . . . . . . . . .   9
  55.  
  56. 8 BIT ASCII CHARACTERS  . . . . . . . . . . . . . . . . . . . . . . . .  11
  57.  
  58. READTABLES  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  12
  59.  
  60. SYMBOL CASE CONTROL . . . . . . . . . . . . . . . . . . . . . . . . . .  14
  61.  
  62. PACKAGES  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  16
  63.  
  64. LAMBDA LISTS  . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  17
  65.  
  66. OBJECTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  19
  67.  
  68. SYMBOLS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  23
  69.  
  70. EVALUATION FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . . .  25
  71.  
  72. MULTIPLE VALUE FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . .  27
  73.  
  74. SYMBOL FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . . . . .  28
  75.  
  76. PACKAGE FUNCTIONS . . . . . . . . . . . . . . . . . . . . . . . . . . .  32
  77.  
  78. PROPERTY LIST FUNCTIONS . . . . . . . . . . . . . . . . . . . . . . . .  36
  79.  
  80. HASH TABLE FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . . .  37
  81.  
  82. ARRAY FUNCTIONS . . . . . . . . . . . . . . . . . . . . . . . . . . . .  38
  83.  
  84. SEQUENCE FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . . . .  39
  85.  
  86. LIST FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . . . . . .  44
  87.  
  88. DESTRUCTIVE LIST FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . .  48
  89.  
  90. ARITHMETIC FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . . .  49
  91.  
  92. BITWISE LOGICAL FUNCTIONS . . . . . . . . . . . . . . . . . . . . . . .  54
  93.  
  94. STRING FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . . . . .  55
  95.  
  96. CHARACTER FUNCTIONS . . . . . . . . . . . . . . . . . . . . . . . . . .  57
  97.  
  98.  
  99.  
  100.  
  101. XLISP 2.1g                   Table of Contents
  102.  
  103.  
  104. STRUCTURE FUNCTIONS . . . . . . . . . . . . . . . . . . . . . . . . . .  59
  105.  
  106. OBJECT FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . . . . .  61
  107.  
  108. PREDICATE FUNCTIONS . . . . . . . . . . . . . . . . . . . . . . . . . .  63
  109.  
  110. CONTROL CONSTRUCTS  . . . . . . . . . . . . . . . . . . . . . . . . . .  67
  111.  
  112. LOOPING CONSTRUCTS  . . . . . . . . . . . . . . . . . . . . . . . . . .  70
  113.  
  114. THE PROGRAM FEATURE . . . . . . . . . . . . . . . . . . . . . . . . . .  71
  115.  
  116. INPUT/OUTPUT FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . .  73
  117.  
  118. THE FORMAT FUNCTION . . . . . . . . . . . . . . . . . . . . . . . . . .  75
  119.  
  120. FILE I/O FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . . . .  78
  121.  
  122. STRING STREAM FUNCTIONS . . . . . . . . . . . . . . . . . . . . . . . .  82
  123.  
  124. DEBUGGING AND ERROR HANDLING FUNCTIONS  . . . . . . . . . . . . . . . .  83
  125.  
  126. SYSTEM FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . . . . .  85
  127.  
  128. ADDITIONAL FUNCTIONS AND UTILITIES  . . . . . . . . . . . . . . . . . .  91
  129.  
  130. BUG FIXES AND EXTENSIONS  . . . . . . . . . . . . . . . . . . . . . . .  95
  131.  
  132. EXAMPLES: FILE I/O FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . 104
  133.  
  134. INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
  135.  
  136.  
  137.  
  138.  
  139. XLISP 2.1g                      INTRODUCTION                         Page 1
  140.  
  141.  
  142.  
  143.  
  144. INTRODUCTION
  145.  
  146. XLISP-PLUS  is an enhanced  version of David  Michael Betz's  XLISP to have
  147. additional  features of Common Lisp. XLISP-PLUS is distributed for the IBM-
  148. PC family  and for  UNIX,  but can  be easily  ported  to other  platforms.
  149. Complete source code  is provided (in "C")  to allow easy  modification and
  150. extension.
  151.  
  152. Since XLISP-PLUS is based on XLISP,  most XLISP programs will run on XLISP-
  153. PLUS. Since XLISP-PLUS incorporates many more features of Common Lisp, many
  154. small  Common  Lisp  applications  will  run   on  XLISP-PLUS  with  little
  155. modification.  See  the section  starting on  page  95 for  details  of the
  156. differences between XLISP and XLISP-PLUS.
  157.  
  158. Many  Common Lisp functions are  built into XLISP-PLUS.  In addition, XLISP
  159. defines the objects  'Object' and  'Class' as primitives.  'Object' is  the
  160. only  class that  has no  superclass and  hence is  the  root of  the class
  161. heirarchy tree. 'Class' is the class of which all classes are instances (it
  162. is the only object that is an instance of itself).
  163.  
  164. This  document  is  a brief  description  of  XLISP-PLUS.  It assumes  some
  165. knowledge of LISP and some understanding of the concepts of object-oriented
  166. programming.
  167.  
  168. You will probably also need a copy of "Common Lisp: The Language" by Guy L.
  169. Steele, Jr., published by Digital Press  to use as a reference for  some of
  170. the Common Lisp functions that are described only briefly in this document.
  171.  
  172. XLISP-PLUS has  a number of compilation  options to to eliminate  groups of
  173. functions and  to tailor itself  to various environments.  Unless otherwise
  174. indicated  this manual  assumes  all options  are  enabled and  the  system
  175. dependent code is as complete as that provided for the MS/DOS  environment.
  176. Assistance for  using or porting XLISP-PLUS  can be obtained  on the USENET
  177. newsgroup  comp.lang.lisp.x,  or by  writing to  Tom  Almy at  the Internet
  178. address tom.almy@tek.com. You can also reach Tom by writing to him at 17830
  179. SW Shasta Trail, Tualatin, OR 97062, USA.
  180.  
  181.  
  182.  
  183.  
  184. XLISP 2.1g                   XLISP COMMAND LOOP                      Page 2
  185.  
  186.  
  187.  
  188. XLISP COMMAND LOOP
  189.  
  190. When XLISP is started, it first tries to load the workspace "xlisp.wks", or
  191. an alternative  file  specified  with  the "-wfilename"  option,  from  the
  192. current directory. If that file doesn't  exist, or the "-w" flag is in  the
  193. command  line,  XLISP builds  an initial  workspace,  empty except  for the
  194. built-in functions and symbols.
  195.  
  196. Then,  providing  no workspace  file was  loaded,   XLISP attempts  to load
  197. "init.lsp" from a path in XLPATH or the current directory. This file can be
  198. modified  to  suit  the  user's  requirements.  It  contains  a  number  of
  199. preference items.
  200.  
  201. If *startup-functions* is non-nil (default  is nil), it is taken as  a list
  202. of functions with no arguments which are executed in sequence at this time.
  203. This allows automatically starting applications stored in workspaces.
  204.  
  205. If  the variable *load-file-arguments* is non-nil (default is "t"), it then
  206. loads any  files named as parameters  on the command line  (after appending
  207. ".lsp" to their names). If the  "-v" flag is in the command line,  then the
  208. files are loaded verbosely. 
  209.  
  210. The option "-tfilename" will open a transcript file of the name "filename".
  211. At this time  the top level command  loop is entered. This  is the function
  212. TOP-LEVEL-LOOP, by default.
  213.  
  214. XLISP  then issues  the following  prompt (unless  standard input  has been
  215. redirected):
  216.  
  217. >
  218.  
  219. This indicates that XLISP is waiting for an  expression to be typed. If the
  220. current package is other than USER, the the package name  is printed before
  221. the ">".
  222.  
  223. When a complete  expression has  been entered, XLISP  attempts to  evaluate
  224. that expression. If the expression evaluates successfully, XLISP prints the
  225. result and then returns for another expression.
  226.  
  227. The following  control characters  can be used  while XLISP is  waiting for
  228. input:
  229.  
  230.      Backspace delete last character
  231.      Del       delete last character
  232.      tab       tabs over (treated as space by XLISP reader)
  233.      ctrl-C    goto top level
  234.      ctrl-G    cleanup and return one level
  235.      ctrl-Z    end of file (returns one level or exits program)
  236.      ctrl-P    proceed (continue)
  237.      ctrl-T    print information
  238.  
  239. Under MS-DOS (at least) the following control characters can be typed while
  240. XLISP is executing (providing  standard input has not been  redirected away
  241. from the console):
  242.  
  243.  
  244.  
  245.  
  246. XLISP 2.1g                   XLISP COMMAND LOOP                      Page 3
  247.  
  248.  
  249.      ctrl-B    BREAK -- enter break loop
  250.      ctrl-S    Pause until another key is struck
  251.      ctrl-C    go to top level
  252.      ctrl-T    print information
  253.  
  254. Under MS-DOS if the global variable *dos-input* is set non-NIL, DOS is used
  255. to read entire input lines. Operation this way is convenient if certain DOS
  256. utilities, such as  CED, are used, or if XLISP is  run under an editor like
  257. EPSILON. In  this case, normal command  line editing is available,  but the
  258. control keys will not work (in particular, ctrl-C will cause the program to
  259. exit!). Use the XLISP  functions top-level, clean-up, and continue  instead
  260. of ctrl-C, ctrl-G, and ctrl-P.
  261.  
  262. Under MS-DOS if the  global variable *dos-input* is NIL, a special internal
  263. line editor is used. In this case the  last 20 lines are saved, and can  be
  264. recalled  and viewed using the up and  down arrow keys. Duplicate lines are
  265. not saved.
  266.  
  267. An  additional feature  is  symbol name  lookup.  This command  takes  what
  268. appears to be  an incomplete  symbol name  to the  left of  the cursor  and
  269. prints  all  interned  symbol  names  that  match.  Case  is  ignored.  The
  270. printnames of the symbols are printed without processing.
  271.  
  272. The control keys for the editor are:
  273.  
  274.      Up Arrow  Previous command in queue
  275.      Down Arrow          Next command in queue
  276.      Left Arrow          Move cursor to left
  277.      Right Arrow         Move cursor to right
  278.      Home      Move cursor to start of line
  279.      End       Move cursor to end of line
  280.      Delete    Delete character at cursor
  281.      Backspace Delete character to left of cursor
  282.      Escape    Delete current line
  283.      Tab       Look up partial symbol name to left of cursor
  284.  
  285. Characters are inserted at  the current cursor position. Lines  are limited
  286. in length  to the width  of the display,  and invalid keystrokes  cause the
  287. bell to ring.
  288.  
  289.  
  290.  
  291.  
  292. XLISP 2.1g                   BREAK COMMAND LOOP                      Page 4
  293.  
  294.  
  295.  
  296. BREAK COMMAND LOOP
  297.  
  298. When  XLISP encounters an error while evaluating an expression, it attempts
  299. to handle the error in the following way:
  300.  
  301. If the symbol  '*breakenable*' is  true, the message  corresponding to  the
  302. error is printed.  If the error is  correctable, the correction  message is
  303. printed.
  304.  
  305. If the symbol  '*tracenable*' is true, a trace back  is printed. The number
  306. of entries printed depends  on the value  of the symbol '*tracelimit*'.  If
  307. this symbol is set to something other than a number, the entire  trace back
  308. stack is printed.
  309.  
  310. XLISP  then enters a read/eval/print loop to  allow the user to examine the
  311. state of  the interpreter in  the context of  the error. This  loop differs
  312. from  the normal top-level read/eval/print loop in that if the user invokes
  313. the function 'continue', XLISP  will continue from a correctable  error. If
  314. the user invokes  the function 'clean-up', XLISP will abort  the break loop
  315. and return to the top level or the next  lower numbered break loop. When in
  316. a break loop, XLISP prefixes the break level to the normal prompt.
  317.  
  318. If the  symbol '*breakenable*' is NIL, XLISP looks for a surrounding errset
  319. function. If one is  found, XLISP examines the value of  the print flag. If
  320. this flag is true, the error message is printed. In any case,  XLISP causes
  321. the errset function call to return NIL.
  322.  
  323. If  there is no surrounding errset function, XLISP prints the error message
  324. and returns to the top level.
  325.  
  326. If XLISP was invoked with the command line argument "-b" then XLISP assumes
  327. it is running in  batch mode. In batch  mode any uncaught error  will cause
  328. XLISP to exit after printing the error message.
  329.  
  330.  
  331.  
  332.  
  333. XLISP 2.1g                       DATA TYPES                          Page 5
  334.  
  335.  
  336.  
  337. DATA TYPES
  338.  
  339. There are several different data types available to XLISP-PLUS programmers.
  340. Typical implementation limits are shown for 32 bit  word systems. Values in
  341. square brackets apply to 16 bit MS-DOS implementations.
  342.  
  343. All data nodes  are effectively cons cells  consisting of two  pointers and
  344. one or two  bytes of identification flags  (9 or 10  bytes per cell).  Node
  345. space is managed and  garbage collected by XLISP. Array and  string storage
  346. is either allocated  by the C runtime or managed  and garbaged collected by
  347. XLISP (compilation option). If C  does the allocation, memory fragmentation
  348. can  occur. Fragmentation  can  be  eliminated  by  saving  the  image  and
  349. restarting XLISP-PLUS.
  350.  
  351.  
  352. ˘    NIL
  353.      Unlike  the original  XLISP,  NIL is  a  symbol (although  not  in the
  354.      *obarray*), to allowing setting its properties.
  355. ˘    lists
  356.      Either NIL  or a CDR-linked list of cons cells, terminated by a symbol
  357.      (typically NIL). Circular lists are allowable,  but can cause problems
  358.      with some functions so they must be used with care.
  359. ˘    arrays
  360.      The CDR field  of an  array points to  the dynamically allocated  data
  361.      array,  while  the  CAR contains  the  integer  length  of the  array.
  362.      Elements in the data array  are pointers to other cells [Size  limited
  363.      to about 16360].
  364. ˘    character strings
  365.      Implemented  like arrays,  except  string array  is  byte indexed  and
  366.      contains the actual characters. Note that unlike the underlying C, the
  367.      null character (value 0) is valid. [Size limited to about 65500]
  368. ˘    symbols
  369.      Implemented  as  a  4 element  array.  The  elements  are value  cell,
  370.      function  cell, property  list,  and print  name  (a character  string
  371.      node). Print names are limited to 100 characters. There are also flags
  372.      for constant and  special. Values bound  to special symbols  (declared
  373.      with DEFVAR or DEFPARAMETER) are always dynamically bound, rather than
  374.      being lexically bound.
  375. ˘    fixnums (integers)
  376.      Small integers (> -129 and <256) are statically allocated and are thus
  377.      always  EQ integers of the  same value. The CAR field  is used to hold
  378.      the value, which is a 32 bit signed integer.
  379. ˘    ratios
  380.      The  CAR field is used  to hold the  numerator while the  CDR field is
  381.      used  to hold the denominator. The numerator  is a 32 bit signed value
  382.      while the denominator is a 31 bit positive value.
  383. ˘    characters
  384.      All  characters are statically allocated and are thus EQ characters of
  385.      the same  value. The CAR  field is  used to hold  the value.  In XLISP
  386.      characters are "unsigned" and thus range in value from 0 to 255.
  387. ˘    flonums (floating point numbers)
  388.      The CAR  and CDR fields hold  the value, which  is typically a  64 bit
  389.      IEEE floating point number.
  390.  
  391.  
  392.  
  393.  
  394. XLISP 2.1g                       DATA TYPES                          Page 6
  395.  
  396.  
  397. ˘    complex numbers
  398.      Part of the math  extension compilation option. Internally implemented
  399.      as an array of  the real and imaginary parts. The parts  can be either
  400.      both  fixnums  or both  flonums. Any  function  which would  return an
  401.      fixnum  complex number  with a  zero imaginary  part returns  just the
  402.      fixnum.
  403. ˘    objects
  404.      Implemented  as an array of instance variable count plus one elements.
  405.      The first element is the object's class, while the remaining arguments
  406.      are the instance variables.
  407. ˘    streams (file)
  408.      The  CAR and CDR fields are  used in a system dependent  way as a file
  409.      pointer.
  410. ˘    streams (unnamed -- string)
  411.      Implemented as a tconc-style list of characters.
  412. ˘    subrs (built-in functions)
  413.      The CAR  field points  to the  actual code to  execute, while  the CDR
  414.      field is an internal pointer to the name of the function.
  415. ˘    fsubrs (special forms)
  416.      Same implementation as subrs.
  417. ˘    closures (user defined functions)
  418.      Implemented as an array of 11 elements:
  419.      1.   name symbol or NIL
  420.      2.   'lambda or 'macro
  421.      3.   list of required arguments
  422.      4.   optional  arguments  as  list  of  (<arg>  <init>  <specified-p>)
  423.           triples.
  424.      5.   &rest argument
  425.      6.   &key  arguments as  list  of (<key>  <arg> <init>  <specified-p>)
  426.           quadruples.
  427.      7.   &aux arguments as list of (<arg> <init>) pairs.
  428.      8.   function body
  429.      9.   value environment (see page 84 for format)
  430.      10.  function environment
  431.      11.  argument list (unprocessed)
  432. ˘    structures
  433.      Implemented as  an array  with first  element being  a pointer  to the
  434.      structure name  string, and the remaining elements being the structure
  435.      elements.
  436. ˘    hash-tables
  437.      Implemented  as a  structure  of varying  length  with no  generalized
  438.      accessing  functions,  but  with   a  special  print  function  (print
  439.      functions not available for standard structures).
  440. ˘    random-states
  441.      Implemented as a  structure with a single element  which is the random
  442.      state  (here  a  fixnum,  but  could  change  without  impacting xlisp
  443.      programs).
  444. ˘    packages
  445.      Implemented using a structure. Packages must  only be manipulated with
  446.      the functions provided.
  447.  
  448.  
  449.  
  450.  
  451. XLISP 2.1g                     THE EVALUATOR                         Page 7
  452.  
  453.  
  454.  
  455. THE EVALUATOR
  456.  
  457. The process of evaluation in XLISP:
  458.  
  459. Strings,  characters, numbers  of  any type,  objects, arrays,  structures,
  460. streams, subrs, fsubrs and closures evaluate to themselves.
  461.  
  462. Symbols  act as  variables  and  are  evaluated  by  retrieving  the  value
  463. associated with their current binding.
  464.  
  465. Lists  are evaluated by  examining the first  element of the  list and then
  466. taking one of the following actions:
  467.  
  468.      If it is a symbol, the functional binding of the symbol is retrieved.
  469.  
  470.      If  it  is a  lambda  expression, a  closure  is  constructed for  the
  471.      function described by the lambda expression.
  472.  
  473.      If it is a subr, fsubr or closure, it stands for itself.
  474.  
  475.      Any other value is an error.
  476.  
  477. Then, the value produced by the previous step is examined:
  478.  
  479.      If it is a subr or  closure, the remaining list elements are evaluated
  480.      and the subr or closure is applied to these evaluated expressions.
  481.  
  482.      If  it is  an  fsubr, the  fsubr  is called  with  the remaining  list
  483.      elements as arguments (unevaluated).
  484.  
  485.      If  it is  a macro,  the  macro is  expanded with  the remaining  list
  486.      elements  as  arguments (unevaluated).  The  macro  expansion is  then
  487.      evaluated  in  place  of  the  original  macro  call.  If  the  symbol
  488.      *displace-macros*   is  not   NIL,  then   the  expanded   macro  will
  489.      (destructively) replace the original macro expression. This means that
  490.      the macro  will only be expanded  once, but the original  code will be
  491.      lost.  The displacement will not  take place unless  the macro expands
  492.      into a list. The standard XLISP practice is the macro will be expanded
  493.      each  time  the expression  is evaluated,  which  negates some  of the
  494.      advantages of using macros.
  495.  
  496.  
  497.  
  498.  
  499. XLISP 2.1g                     HOOK FUNCTIONS                        Page 8
  500.  
  501.  
  502.  
  503. HOOK FUNCTIONS
  504.  
  505. The evalhook and applyhook  facility are useful for  implementing debugging
  506. programs or  just  observing the  operation  of XLISP.  It is  possible  to
  507. control evaluation of forms in any context.
  508.  
  509. If the symbol '*evalhook*' is bound  to a function closure, then every call
  510. of eval  will call this  function. The  function takes two  arguements, the
  511. form to be  evaluated and  execution environment. During  the execution  of
  512. this function, *evalhook* (and *applyhook*) are dynamically bound to NIL to
  513. prevent undesirable recursion.  This "hook" function returns  the result of
  514. the evaluation.
  515.  
  516. If the  symbol '*applyhook*' is  bound to  a function, then  every function
  517. application within an eval will call this function  (note that the function
  518. apply, and  others which do  not use eval, will  not invoke the  apply hook
  519. function). The function takes  two arguments, the function closure  and the
  520. argument list (which is  already evaluated). During execution of  this hook
  521. function, *applyhook*  (and *evalhook*)  are dynamically  bound  to NIL  to
  522. prevent undesired recursion. This  function is to return the result  of the
  523. function application.
  524.  
  525. Note that the hook functions cannot reset *evalhook* or *applyhook* to NIL,
  526. because  upon  exit these  values will  be  reset. An  excape  mechanism is
  527. provided --  execution of 'top-level', or  any error that causes  return to
  528. the  top level, will unhook  the functions. Applications  should bind these
  529. values either via 'progv', 'evalhook', or 'applyhook'.
  530.  
  531. The functions 'evalhook' and 'applyhook' allowed for controlled application
  532. of  the hook functions. The form supplied  as an argument to 'evalhook', or
  533. the  function application given to 'applyhook',  are not hooked themselves,
  534. but  any subsidiary forms and  applications are. In  addition, by supplying
  535. NIL values for the hook functions, 'evalhook' can be used to execute a form
  536. within a specific environment passed as an argument.
  537.  
  538. An additional hook function exists for the garbage collector. If the symbol
  539. '*gc-hook*'  is bound to  a function,  then this  function is  called after
  540. every garbage collection. The function has two arguments. The first  is the
  541. total  number of nodes,  and the second  is the  number of nodes  free. The
  542. return value is ignored. During the execution of the function, *gc-hook* is
  543. dynamically bound to NIL to prevent undesirable recursion.
  544.  
  545.  
  546.  
  547.  
  548. XLISP 2.1g                  LEXICAL CONVENTIONS                      Page 9
  549.  
  550.  
  551.  
  552. LEXICAL CONVENTIONS
  553.  
  554. The following conventions must be followed when entering XLISP programs:
  555.  
  556. Comments in XLISP  code begin with  a semi-colon character and  continue to
  557. the end of the line.
  558.  
  559. Except when escape sequences are used, symbol names in XLISP can consist of
  560. any sequence of non-blank printable characters except the terminating macro
  561. characters:
  562.  
  563.      ( ) ' ` , " ;
  564.  
  565. and the escape characters:
  566.  
  567.      \ |
  568.  
  569. In  addition, the  first character  may not  be '#'  (non-terminating macro
  570. character),  nor  may  the symbol  have  identical  syntax  with a  numeric
  571. literal. Uppercase  and lowercase  characters are not  distinguished within
  572. symbol  names  because,  by default,  lowercase  characters  are mapped  to
  573. uppercase on input.
  574.  
  575. Any printing character, including  whitespace, may be part of a symbol name
  576. when  escape  characters are  used.  The  backslash escapes  the  following
  577. character, while multiple characters can be escaped by placing them between
  578. vertical bars. At  all times the  backslash must be  used to escape  either
  579. escape characters.
  580.  
  581. For  semantic reasons,  certain chararacter  sequences should/can  never be
  582. used as symbols in XLISP. A  single period is used to denote dotted  lists.
  583. The  symbol T is also reserved  for use as the truth  value. The symbol NIL
  584. represents an empty list. 
  585.  
  586. Symbols starting with  a colon  are keywords, and  will always evaluate  to
  587. themselves. When the package facility is  compiled as part of XLISP, colons
  588. have a special  significance. Thus colons should  not be used as  part of a
  589. symbol name, except for these special uses.
  590.  
  591. Fixnum (integer)  literals  consist  of  a sequence  of  digits  optionally
  592. beginning  with a sign  ('+' or  '-'). The range  of values  an integer can
  593. represent is  limited by the  size of a  C 'long' on  the machine  on which
  594. XLISP is running. 
  595.  
  596. Ratio  literals  consist  of two  integer  literals  separated  by a  slash
  597. character ('/').  The second  number, the  denominator,  must be  positive.
  598. Ratios  are automatically  reduced to  their cannonical  form; if  they are
  599. integral, then they are reduced to an integer.
  600.  
  601. Flonum (floating point) literals consist of a sequence of digits optionally
  602. beginning with a sign ('+' or '-') and including one or both of an embedded
  603. decimal point or  a trailing exponent. The optional exponent  is denoted by
  604. an  'E' or 'e'  followed by an  optional sign and  one or more  digits. The
  605.  
  606.  
  607.  
  608.  
  609. XLISP 2.1g                  LEXICAL CONVENTIONS                     Page 10
  610.  
  611.  
  612. range of values  a floating point  number can represent  is limited by  the
  613. size of a C 'double' on most machines on which XLISP is running.
  614.  
  615. Numeric literals cannot have  embedded escape characters. If they  do, they
  616. are treated as symbols. Thus '12\3' is a symbol even though it would appear
  617. to be identical to '123'.
  618.  
  619. Complex literals are  constructed using a read-macro of the format #C(r i),
  620. where r is  the real part and i  is the imaginary part. The  numeric fields
  621. can  be any valid fixnum, ratio,  or flonum literal. If  either field has a
  622. ratio or flonum literal, then both values are converted  to flonums. Fixnum
  623. complex  literals with a zero  imaginary part are  automatically reduced to
  624. fixnums.
  625.  
  626. Character literals are handled via the #\ read-macro construct:
  627.  
  628.      #\<char>       == the ASCII code of the printing character
  629.      #\newline      == ASCII linefeed character
  630.      #\space        == ASCII space character
  631.      #\rubout       == ASCII rubout (DEL)
  632.      #\C-<char>     == ASCII control character
  633.      #\M-<char>     == ASCII character with msb set (Meta character)
  634.      #\M-C-<char>   == ASCII control character with msb set
  635.  
  636.  
  637. Literal strings  are sequences  of characters  surrounded by  double quotes
  638. (the  " read-macro). Within  quoted strings  the '\'  character is  used to
  639. allow non-printable characters to be included. The codes
  640. recognized are:
  641.  
  642.      \\        means the character '\'
  643.      \n        means newline
  644.      \t        means tab
  645.      \r        means return
  646.      \f        means form feed
  647.      \nnn      means the character whose octal code is nnn
  648.  
  649.  
  650.  
  651.  
  652. XLISP 2.1g                 8 BIT ASCII CHARACTERS                   Page 11
  653.  
  654.  
  655.  
  656. 8 BIT ASCII CHARACTERS
  657.  
  658. When  used in  an IBM  PC environment  (or perhaps  others), XLISP-PLUS  is
  659. compiled  by default to allow the full use of the IBM 8 bit ASCII character
  660. set,  including all characters with  diacritic marks. Note  that using such
  661. characters will make  programs non-portable. XLISP-PLUS can be compiled for
  662. standard 7 bit ASCII if desired for portability.
  663.  
  664. When 8 bit ASCII is enabled, the following system characteristics change:
  665.  
  666. Character  codes 128 to  254 are marked  as :constituent in  the readtable.
  667. This  means that  any of  the new  characters  (except for  the nonprinting
  668. character  255)  can be  symbol  constituent.  Alphabetic characters  which
  669. appear in both cases, such  as Ç and ê,  are considered to be  alphabetical
  670. for  purposes of symbol case control, while  characters such as † that have
  671. no coresponding upper case are not considered to be alphabetical.
  672.  
  673. The  reader  is extended  for  the character  data  type to  allow  all the
  674. additional  characters  (except  code 255)  to  be  entered  literally, for
  675. instance "#\Ç".  These characters are  also printed literally,  rather than
  676. using  the "M-" construct. Code  255 must still be  entered as, and will be
  677. printed as, "#\M-Rubout".
  678.  
  679. Likewise strings  do  not  need  and  will not  use  the  backslash  escape
  680. mechanism for codes 128 to 254.
  681.  
  682. The functions alphanumericp,  alpha-char-p, upper-case-p, and  lower-case-p
  683. perform  as  would be  expected on  the  extended characters,  treating the
  684. diacritic characters  as their  unadorned counterparts.  As per  the Common
  685. Lisp definition, both-case-p will only indicate  T for characters available
  686. in both cases.
  687.  
  688.  
  689.  
  690.  
  691. XLISP 2.1g                       READTABLES                         Page 12
  692.  
  693.  
  694.  
  695. READTABLES
  696.  
  697. The  behaviour of  the reader is  controlled by  a data  structure called a
  698. "readtable". The reader uses  the symbol *readtable* to locate  the current
  699. readtable. This table controls the interpretation of input characters -- if
  700. it is  changed then  the section  LEXICAL  CONVENTIONS may  not apply.  The
  701. readtable is an array with 256 entries, one for each of the extended  ASCII
  702. character codes. Each entry contains one  of the following values, with the
  703. initial entries assigned to the values indicated:
  704.  
  705.      :white-space        A whitespace character - tab, cr, lf, ff, space
  706.      (:tmacro . fun)     terminating readmacro - ( ) " , ; ' `
  707.      (:nmacro . fun)     non-terminating readmacro - #
  708.      :sescape            Single escape character - \
  709.      :mescape            Multiple escape character - |
  710.      :constituent        Indicating  a  symbol  constituent  (all  printing
  711.                          characters not listed above)
  712.      NIL                 Indicating an invalid character (everything else)
  713.  
  714. In the case of :TMACRO and :NMACRO, the "fun" component is a function. This
  715. can either  be a built-in  readmacro function or  a lambda  expression. The
  716. function takes two parameters. The first is the input stream and the second
  717. is the character that caused the invocation of the readmacro. The readmacro
  718. function should return NIL to indicate that the character should be treated
  719. as white space  or a value consed with  NIL to indicate that  the readmacro
  720. should be  treated as an occurance  of the specified value.  Of course, the
  721. readmacro code is free to read additional characters from the input stream.
  722. A  :nmacro is  a symbol  constituent  except as  the first  character of  a
  723. symbol.
  724.  
  725. As an  example, the following read  macro allows the square  brackets to be
  726. used as a more visibly appealing alternative to the SEND function:
  727.  
  728. (setf (aref *readtable* (char-int #\[)) ; #\[ table entry
  729.       (cons :tmacro
  730.             (lambda (f c &aux ex) ; second arg is not used
  731.                     (do ()
  732.                         ((eq (peek-char t f) #\]))
  733.                         (setf ex (append ex (list (read f)))))
  734.                     (read-char f) ; toss the trailing #\]
  735.                     (cons (cons 'send ex) NIL))))
  736.  
  737. (setf (aref *readtable* (char-int #\]))
  738.       (cons :tmacro
  739.             (lambda (f c)
  740.                     (error "misplaced right bracket"))))
  741.  
  742.  
  743.  
  744.  
  745. XLISP 2.1g                       READTABLES                         Page 13
  746.  
  747.  
  748. XLISP defines several useful read macros:
  749.  
  750.      '<expr>             == (quote <expr>)
  751.      `<expr>             == (backquote <expr>)
  752.      ,<expr>             == (comma <expr>)
  753.      ,@<expr>            == (comma-at <expr>)
  754.      #'<expr>            == (function <expr>)
  755.      #(<expr>...)        == an array of the specified expressions
  756.      #S(<structtype> [<slotname> <value>]...)
  757.                          == structure of specified type and initial values
  758.      #.<expr>            == result of evaluating <expr>
  759.      #x<hdigits>         == a hexadecimal number (0-9,A-F)
  760.      #o<odigits>         == an octal number (0-7)
  761.      #b<bdigits>         == a binary number (0-1)
  762.      #|  |#              == a comment
  763.      #:<symbol>          == an uninterned symbol
  764.      #C(r i)             == a complex number
  765.      #+<expr>            == conditional on feature expression true
  766.      #-<expr>            == conditional on feature expression false
  767.  
  768. A feature expression  is either a symbol or a list  where the first element
  769. is AND,  OR, or NOT and  any remaining elements (NOT  requires exactly one)
  770. are  feature expressions.  A  symbol is  true if  it is  a member  (by test
  771. function  EQ) of the list  in global variable  *FEATURES*. Init.lsp defines
  772. one initial feature,  :XLISP, and the  features :TIMES, :GENERIC,  :POSFCNS
  773. (various position  functions), :MATH (complex math),  :PC8 (character set),
  774. :PACKAGES, and :MULVALS depending on  the coresponding feature having  been
  775. compiled into the XLISP executable. Utility files supplied with  XLISP-PLUS
  776. generally add new features which are EQ to the keyword made from their file
  777. names.
  778.  
  779.  
  780.  
  781.  
  782. XLISP 2.1g                  SYMBOL CASE CONTROL                     Page 14
  783.  
  784.  
  785.  
  786. SYMBOL CASE CONTROL
  787.  
  788. XLISP-PLUS   uses  two  variables,  *READTABLE-CASE*  and  *PRINT-CASE*  to
  789. deturmine  case   conversion  during  reading  and   printing  of  symbols.
  790. *READTABLE-CASE*  can  have  the  values  :UPCASE  :DOWNCASE  :PRESERVE  or
  791. :INVERT, while  *PRINT-CASE*  can  have the  values  :UPCASE  :DOWNCASE  or
  792. :CAPITALIZE. By default, or when other values have been specified, both are
  793. :UPCASE.
  794.  
  795. When *READTABLE-CASE*  is :UPCASE,  all unescaped lowercase  characters are
  796. converted  to  uppercase when  read. When  it  is :DOWNCASE,  all unescaped
  797. uppercase  characters are  converted to  lowercase. This  mode is  not very
  798. useful  because the predefined symbols are all  uppercase and would need to
  799. be  escaped to read them. When *READTABLE-CASE* is :PRESERVE, no conversion
  800. takes  place. This allows case sensitive input with predefined functions in
  801. uppercase. The final  choice, :INVERT, will  invert the case of  any symbol
  802. that is not mixed case. This provides case sensitive input while making the
  803. predefined functions and variables appear to be in lowercase.
  804.  
  805. The  printing of symbols involves the settings of both *READTABLE-CASE* and
  806. *PRINT-CASE*. When  *READTABLE-CASE* is  :UPCASE, lowercase  characters are
  807. escaped (unless PRINC is used), and uppercase characters are printed in the
  808. case  specified  by  *PRINT-CASE*.   When  *READTABLE-CASE*  is  :DOWNCASE,
  809. uppercase  characters are escaped (unless PRINC is used), and lowercase are
  810. printed  in the case specified  by *PRINT-CASE*. The  *PRINT-CASE* value of
  811. :CAPITALIZE means that the first character of the symbol, and any character
  812. in  the symbol immediately following a non-alphabetical character are to be
  813. in  uppercase, while  all  other  alphabetical  characters  are  to  be  in
  814. lowercase. The remaining *READTABLE-CASE*  modes ignore *PRINT-CASE* and do
  815. not  escape  alphabetic characters.  :PRESERVE  never changes  the  case of
  816. characters while :INVERT inverts the case of any non mixed-case symbols.
  817.  
  818. There are five major useful combinations of these modes:
  819.  
  820. A:  *READTABLE-CASE* :UPCASE  *PRINT-CASE* :UPCASE
  821.  
  822. "Traditional" mode.  Case insensitive input;  must escape to  put lowercase
  823. characters in symbol names. Symbols print exactly as they are  stored, with
  824. lowercase characters escaped when PRIN1 is used.
  825.  
  826. B:  *READTABLE-CASE* :UPCASE  *PRINT-CASE* :DOWNCASE
  827.  
  828. "Eyesaver"  mode. Case  insensitive  input; must  escape  to put  lowercase
  829. characters in  symbol  name. Symbols  print  entirely in  lowercase  except
  830. symbols escaped when lowercase characters present with PRIN1.
  831.  
  832. C:  *READTABLE-CASE* :PRESERVE
  833.  
  834. "Oldfashioned  case  sensitive"  mode.  Case  sensitive  input.  Predefined
  835. symbols  must be typed in uppercase. No alpha quoting needed. Symbols print
  836. exactly as stored.
  837.  
  838.  
  839.  
  840.  
  841. XLISP 2.1g                  SYMBOL CASE CONTROL                     Page 15
  842.  
  843.  
  844. D:  *READTABLE-CASE* :INVERT
  845.  
  846. "Modern case sensitive" mode. Case sensitive input. Predefined symbols must
  847. be  typed in lowercase. Alpha quoting should be avoided. Predefined symbols
  848. print in lower case, other symbols print as they were entered.
  849.  
  850. E: *READTABLE-CASE* :UPCASE  *PRINT-CASE* :CAPITALIZE
  851.  
  852. Like case B, except symbol names print capitalized.
  853.  
  854. As far as compatibility between these modes are concerned,  data printed in
  855. mode A can be read in A, B, C, or E. Data  printed in mode B can be read in
  856. A,  B, D, or E.  Data printed in mode  C can be  read in mode C,  and if no
  857. lowercase symbols in  modes A, B and E as well.  Data printed in mode D can
  858. be read in mode D, and if no (internally) lowercase symbols in modes  A, B,
  859. and E as well. Data printed in  mode E can be read in modes A, B, and E. In
  860. addition, symbols  containing characters  requiring quoting  are compatible
  861. among all modes.
  862.  
  863.  
  864.  
  865.  
  866. XLISP 2.1g                        PACKAGES                          Page 16
  867.  
  868.  
  869.  
  870. PACKAGES
  871.  
  872. When compiled in, XLISP-PLUS  provides the "Packages" name  hiding facility
  873. of Common  Lisp.  When in  use,  there  are multiple  object  arrays  (name
  874. spaces). Each package  has internal and external symbols.  Internal symbols
  875. can only normally be accessed while in that package, while external symbols
  876. can  be imported  into the  current  package and  used as  though they  are
  877. members of the current  package. There are three standard  packages, XLISP,
  878. KEYWORD, and USER. In addition, some of the utility programs are in package
  879. TOOLS.  Normally one  is  in package  USER, which  is initally  empty. USER
  880. imports all external symbols  from XLISP, which contains all  the functions
  881. and variables described in the body of this document. Symbols which are not
  882. imported into the current package, but are declared to be external in their
  883. home package, can be referenced with the syntax "packageName:symbolName" to
  884. identify symbol s_y_m_b_o_l_N_a_m_e_  in package p_a_c_k_a_g_e_N_a_m_e_. Those symbols which are
  885. internal  in their  home package  need the  slightly more  difficult syntax
  886. "packageName::symbolName".
  887.  
  888. The KEYWORD  package is referenced by  a symbol name with  a leading colon.
  889. All keywords are  in this  package. All keywords  are automatically  marked
  890. external, and are interned as constants with themselves as their values.
  891.  
  892. To build an application in a package (to avoid name clashes, for instance),
  893. use  MAKE-PACKAGE to  create a new  package (only  if the  package does not
  894. already  exist, use  FIND-PACKAGE  to test  first),  and then  preceed  the
  895. application with the IN-PACKAGE command to set the  package. Use the EXPORT
  896. function to  indicate the symbols that will  be accessable from outside the
  897. package.
  898.  
  899. To  use an  application in a  package, either  use IMPORT  to make specific
  900. symbols  accessable as local internal symbols, use USE-PACKAGE to make them
  901. all accessable, or explicitly reference the symbols with the colon syntax.
  902.  
  903. For the  subtleties of the package facility, read Common Lisp the Language,
  904. second edition.
  905.  
  906.  
  907.  
  908.  
  909. XLISP 2.1g                      LAMBDA LISTS                        Page 17
  910.  
  911.  
  912.  
  913. LAMBDA LISTS
  914.  
  915. There  are several  forms in  XLISP that  require that  a "lambda  list" be
  916. specified. A  lambda list is  a definition of  the arguments accepted  by a
  917. function. There are four different types of arguments.
  918.  
  919. The  lambda list starts with required arguments. Required arguments must be
  920. specified in every call to the function.
  921.  
  922. The required  arguments are followed  by the &optional  arguments. Optional
  923. arguments  may  be  provided  or  omitted  in  a  call.  An  initialization
  924. expression  may be  specified to provide  a default value  for an &optional
  925. argument if it  is omitted from a call. If  no initialization expression is
  926. specified, an omitted  argument is initialized to NIL. It  is also possible
  927. to  provide  the name  of  a  'supplied-p' variable  that  can  be used  to
  928. determine  if  a  call  provided  a  value  for  the  argument  or  if  the
  929. initialization expression  was used. If specified,  the supplied-p variable
  930. will be bound to  T if a  value was specified  in the call  and NIL if  the
  931. default value was used.
  932.  
  933. The  &optional  arguments are  followed by  the  &rest argument.  The &rest
  934. argument  gets  bound  to the  remainder  of the  argument  list  after the
  935. required and &optional arguments have been removed.
  936.  
  937. The  &rest argument  is  followed by  the &key  arguments.  When a  keyword
  938. argument is passed to  a function, a pair of values appears in the argument
  939. list. The first expression in the pair should evaluate to  a keyword symbol
  940. (a  symbol that begins with  a ':'). The value of  the second expression is
  941. the value of the keyword argument. Like &optional arguments, &key arguments
  942. can  have  initialization  expressions  and  supplied-p  variables.  It  is
  943. possible  to specify  the keyword  to be  used in  a  function call.  If no
  944. keyword is specified, the keyword obtained by adding a ':' to the beginning
  945. of  the keyword  argument symbol is  used. In  other words,  if the keyword
  946. argument symbol is 'foo', the keyword will be ':foo'. 
  947.  
  948. If  identical  keywords occur,  those after  the  first are  ignored. Extra
  949. keywords will signal an error unless &allow-other-keys is present, in which
  950. case the extra keywords are ignored. Also, if the keyword :allow-other-keys
  951. is used  in  the  function/macro  call,  and  has  a  non-nil  value,  then
  952. additional keys will be ignored.
  953.  
  954. The &key arguments  are followed  by the  &aux variables.  These are  local
  955. variables that are bound during the  evaluation of the function body. It is
  956. possible to have initialization expressions for the &aux variables.
  957.  
  958.  
  959.  
  960.  
  961. XLISP 2.1g                      LAMBDA LISTS                        Page 18
  962.  
  963.  
  964. Here is the complete syntax for lambda lists:
  965.  
  966.      (<rarg>...
  967.       [&optional [<oarg> | (<oarg> [<init> [<svar>]])]...]
  968.       [&rest <rarg>]
  969.       [&key
  970.        [<karg>  |  ([<karg>  |  (<key>  <karg>)]  [<init>  [<svar>]])]  ...
  971.      [&allow-other-keys]]
  972.       [&aux [<aux> | (<aux> [<init>])]...])
  973.  
  974.     where:
  975.  
  976.      <rarg>    is a required argument symbol
  977.      <oarg>    is an &optional argument symbol
  978.      <rarg>    is the &rest argument symbol
  979.      <karg>    is a &key argument symbol
  980.      <key>     is a keyword symbol (starts with ':')
  981.      <aux>     is an auxiliary variable symbol
  982.      <init>    is an initialization expression
  983.      <svar>    is a supplied-p variable symbol
  984.  
  985.  
  986.  
  987.  
  988. XLISP 2.1g                        OBJECTS                           Page 19
  989.  
  990.  
  991.  
  992. OBJECTS
  993.  
  994. Definitions:
  995.  
  996. ˘    selector - a symbol used to select an appropriate method
  997. ˘    message - a selector and a list of actual arguments
  998. ˘    method - the code that implements a message
  999.  
  1000. Since XLISP was  created to provide a  simple basis for experimenting  with
  1001. object-oriented programming,  one of the  primitive data types  included is
  1002. 'object'.  In XLISP, an  object consists of  a data structure  containing a
  1003. pointer to the object's class as well as an array containing the  values of
  1004. the object's instance variables.
  1005.  
  1006. Officially, there is  no way to see inside an object (look at the values of
  1007. its instance variables).  The only way to communicate with  an object is by
  1008. sending it a message.
  1009.  
  1010. You  can send  a  message to  an  object using  the  'send' function.  This
  1011. function takes the  object as its first  argument, the message selector  as
  1012. its  second argument (which must be a  symbol) and the message arguments as
  1013. its remaining arguments.
  1014.  
  1015. The  'send' function  determines  the class  of  the receiving  object  and
  1016. attempts to find a method corresponding  to the message selector in the set
  1017. of  messages defined for  that class. If  the message  is not found  in the
  1018. object's class and  the class has  a super-class, the  search continues  by
  1019. looking at the messages defined for the super-class. This process continues
  1020. from one super-class to  the next until a method for  the message is found.
  1021. If no method is found, an error occurs.
  1022.  
  1023. To perform a  method lookup  starting with the  method's superclass  rather
  1024. than  the  object's class,  use the  function  'send-super'. This  allows a
  1025. subclass to  invoke a standard  method in its  parent class even  though it
  1026. overrides that method with its own specialized version.
  1027.  
  1028. When a  method is found,  the evaluator binds  the receiving object  to the
  1029. symbol 'self' and evaluates the method using the remaining elements  of the
  1030. original  list as  arguments  to the  method.  These arguments  are  always
  1031. evaluated prior to being bound to their corresponding formal arguments. The
  1032. result of evaluating the method becomes the result of the expression.
  1033.  
  1034. Two  objects, both classes, are  predefined: Object and  Class. Both Object
  1035. and Class  are of class  Class. The  superclass of Class  is Object,  while
  1036. Object has no superclass. Typical use is to create new  classes (by sending
  1037. :new  to Class) to represent application objects. Objects of these classes,
  1038. created by  sending :new to  the appropriate  new class, are  subclasses of
  1039. Object. The  Object method :show  can be used  to view the contents  of any
  1040. object.
  1041.  
  1042.  
  1043.  
  1044.  
  1045. XLISP 2.1g                        OBJECTS                           Page 20
  1046.  
  1047.  
  1048. THE 'Object' CLASS
  1049.  
  1050. Object  THE TOP OF THE CLASS HEIRARCHY
  1051.  
  1052. Messages:
  1053.  
  1054.      :show                              SHOW AN OBJECT'S INSTANCE VARIABLES
  1055.                returns   the object
  1056.  
  1057.      :class                                   RETURN THE CLASS OF AN OBJECT
  1058.                returns   the class of the object
  1059.  
  1060.      :prin1 [<stream>]                                     PRINT THE OBJECT
  1061.                <stream>  T  is  *terminal-io*,  NIL  does  not  print  (for
  1062.                          FLATSIZE calculation), and  default is  *standard-
  1063.                          output*
  1064.                returns   the object
  1065.  
  1066.      :isnew                       THE DEFAULT OBJECT INITIALIZATION ROUTINE
  1067.                returns   the object
  1068.  
  1069.      :superclass                           GET THE SUPERCLASS OF THE OBJECT
  1070.                returns   NIL
  1071.                (Defined in classes.lsp, see :superclass below)
  1072.  
  1073.      :ismemberof <class>                                   CLASS MEMBERSHIP
  1074.                <class>   class name
  1075.                returns   T if object member of class, else NIL
  1076.                (defined in classes.lsp)
  1077.  
  1078.      :iskindof <class>                                     CLASS MEMBERSHIP
  1079.                <class>   class name
  1080.                returns   T  if object member of class or subclass of class,
  1081.                          else NIL
  1082.                (defined in classes.lsp)
  1083.  
  1084.      :respondsto <sel>                                   SELECTOR KNOWLEDGE
  1085.                <sel>     message selector
  1086.                returns   T if  object responds  to  message selector,  else
  1087.                          NIL.
  1088.                (defined in classes.lsp)
  1089.  
  1090.      :storeon                                           READ REPRESENTATION
  1091.                returns   a list, that  when executed will create  a copy of
  1092.                          the  object. Only  works  for  members of  classes
  1093.                          created with defclass.
  1094.                (defined in classes.lsp)
  1095.  
  1096.  
  1097.  
  1098.  
  1099. XLISP 2.1g                        OBJECTS                           Page 21
  1100.  
  1101.  
  1102. THE 'Class' CLASS
  1103.  
  1104. Class   THE CLASS OF ALL OBJECT CLASSES (including itself)
  1105.  
  1106. Messages:
  1107.  
  1108.      :new                                  CREATE A NEW INSTANCE OF A CLASS
  1109.                returns   the new class object
  1110.  
  1111.      :isnew <ivars> [<cvars> [<super>]]              INITIALIZE A NEW CLASS
  1112.                <ivars>   the list of instance variable symbol
  1113.                <cvars>   the list of class variable symbols
  1114.                <super>   the superclass (default is Object)
  1115.                returns   the new class object
  1116.  
  1117.      :answer <msg> <fargs> <code>                  ADD A MESSAGE TO A CLASS
  1118.                <msg>     the message symbol
  1119.                <fargs>   the formal argument list (lambda list)
  1120.                <code>    a list of executable expressions
  1121.                returns   the object
  1122.  
  1123.      :superclass                           GET THE SUPERCLASS OF THE OBJECT
  1124.                returns   the superclass (of the class)
  1125.                (defined in classes.lsp)
  1126.  
  1127.      :messages                        GET THE LIST OF MESSAGES OF THE CLASS
  1128.                returns   association list of message selectors and closures
  1129.                          for messages.
  1130.                (defined in classes.lsp)
  1131.  
  1132.      :storeon                                           READ REPRESENTATION
  1133.                returns   a  list,  that when  executed  will re-create  the
  1134.                          class and its methods.
  1135.                (defined in classes.lsp)
  1136.  
  1137. When a new instance of a class is created by sending the message  ':new' to
  1138. an  existing class,  the message ':isnew'  followed by  whatever parameters
  1139. were passed  to the  ':new' message  is sent to  the newly  created object.
  1140. Therefore, when a new class  is created by sending ':new' to  class 'Class'
  1141. the message ':isnew' is sent to Class automatically. To create a new class,
  1142. a function of the following format is used:
  1143.     (setq <newclassname> (send Class :new <ivars> [<cvars> [<super>]]))
  1144.  
  1145. When  a new  class  is created,  an  optional  parameter may  be  specified
  1146. indicating the superclass  of the new class. If  this parameter is omitted,
  1147. the new class will be a subclass of 'Object'. A class inherits all instance
  1148. variables,  and methods  from its  super-class. Only  class variables  of a
  1149. method's class are accessable.
  1150.  
  1151.  
  1152.  
  1153.  
  1154. XLISP 2.1g                        OBJECTS                           Page 22
  1155.  
  1156.  
  1157. INSTANCE VARIABLES OF CLASS 'CLASS':
  1158.  
  1159.      MESSAGES  -  An  association  list   of  message  names  and  closures
  1160.                implementing the messages.
  1161.  
  1162.      IVARS - List of names of instance variables.
  1163.  
  1164.      CVARS - List of names of class variables.
  1165.  
  1166.      CVAL - Array of class variable values.
  1167.  
  1168.      SUPERCLASS -  The superclass  of this class  or NIL  if no  superclass
  1169.                (only for class OBJECT).
  1170.  
  1171.      IVARCNT - instance variables in this class (length of IVARS)
  1172.  
  1173.      IVARTOTAL  -  total   instance  variables  for  this   class  and  all
  1174.                superclasses of this class.
  1175.  
  1176.      PNAME - printname string for this class.
  1177.  
  1178.  
  1179.  
  1180.  
  1181. XLISP 2.1g                        SYMBOLS                           Page 23
  1182.  
  1183.  
  1184.  
  1185. SYMBOLS
  1186.  
  1187. All  values are initially NIL  unless otherwise specified.  All are special
  1188. variables unless indicated to be constants.
  1189.  
  1190. ˘    NIL -  represents empty list  and the boolean  value for "false".  The
  1191.      value of NIL is  NIL, and cannot be changed  (it is a constant).  (car
  1192.      NIL) and (cdr NIL) are also defined to be NIL.
  1193. ˘    t - boolean value "true" is constant with value t.
  1194. ˘    self -  within a method  context, the  current object  (see page  19),
  1195.      otherwise initially unbound.
  1196. ˘    object - constant, value is the class 'Object.'
  1197. ˘    class - constant, value is the class 'Class'.
  1198. ˘    internal-time-units-per-second  - integer constant  to divide returned
  1199.      times by to get time in seconds.
  1200. ˘    pi - floating  point aproximation  of pi (constant  defined when  math
  1201.      extension is compiled).
  1202. ˘    *obarray* - the  object hash table. Length  of array is  a compilation
  1203.      option. Objects are hashed using the hash function and are placed on a
  1204.      list in the appropriate array slot. This variable does note exist when
  1205.      the package feature is compiled in.
  1206. ˘    *package*  - the current  package. Do not  alter. Part of  the package
  1207.      feature.
  1208. ˘    *terminal-io* - stream bound to keyboard and display. Do not alter.
  1209. ˘    *standard-input*  - the  standard  input stream,  initially stdin.  If
  1210.      stdin is not  redirected on  the command line,  then *terminal-io*  is
  1211.      used so that all interactive i/o uses the same stream.
  1212. ˘    *standard-output* -  the standard output stream,  initially stdout. If
  1213.      stdout is not  redirected on  the command line  then *terminal-io*  is
  1214.      used so that all interactive i/o uses the same stream.
  1215. ˘    *error-output* - the error output stream (used by all error messages),
  1216.      initially same as *terminal-io*.
  1217. ˘    *trace-output* - the trace output stream (used by the trace function),
  1218.      initially same as *terminal-io*.
  1219. ˘    *debug-io*   -  the  break   loop  i/o   stream,  initially   same  as
  1220.      *terminal-io*. System messages  (other than error messages) also print
  1221.      out on this stream.
  1222. ˘    *breakenable* -  flag controlling entering  break loop on  errors (see
  1223.      page 4)
  1224. ˘    *tracelist* -  list of names  of functions to  trace, as set  by trace
  1225.      function.
  1226. ˘    *tracenable* - enable trace back printout on errors (see page 4).
  1227. ˘    *tracelimit*  - number of levels  of trace back  information (see page
  1228.      4).
  1229. ˘    *evalhook* - user substitute  for the evaluator function (see  page 8,
  1230.      and evalhook and applyhook functions).
  1231. ˘    *applyhook* -  user substitute for  function application (see  page 8,
  1232.      and evalhook and applyhook functions).
  1233. ˘    *readtable* - the current readtable (see page 12).
  1234. ˘    *gc-flag*  - controls  the printing  of gc  messages. When  non-NIL, a
  1235.      message  is printed  after each  garbage collection  giving  the total
  1236.      number of nodes and the number of nodes free.
  1237. ˘    *gc-hook* - function to call after garbage collection (see page 8).
  1238.  
  1239.  
  1240.  
  1241.  
  1242. XLISP 2.1g                        SYMBOLS                           Page 24
  1243.  
  1244.  
  1245. ˘    *integer-format* - format for  printing integers (when not bound  to a
  1246.      string, defaults to "%d" or "%ld" depending on implementation)
  1247. ˘    *ratio-format*  -  format for  printing ratios  (when  not bound  to a
  1248.      string, defaults to "%d/%d" or "%ld/%ld" depending on implementation)
  1249. ˘    *float-format*  -  format for  printing floats  (when  not bound  to a
  1250.      string, defaults to "%g")
  1251. ˘    *readtable-case*  - symbol  read  and output  case.  See page  14  for
  1252.      details
  1253. ˘    *print-case*  -  symbol output  case when  printing.  See page  14 for
  1254.      details
  1255. ˘    *print-level* - When bound to a number, list levels  beyond this value
  1256.      are printed as '#'. Used by all printing functions. Good precaution to
  1257.      avoid getting caught in circular lists.
  1258. ˘    *print-length* - When bound  to a number, lists longer than this value
  1259.      are  printed as '...'. Used by all printing functions. Good precaution
  1260.      to avoid getting caught in circular lists.
  1261. ˘    *dos-input* - When not NIL, uses dos line input function for read (see
  1262.      page 3).
  1263. ˘    *displace-macros*  -  When  not  NIL,  macros  are  replaced  by their
  1264.      expansions when exectuted (see page 7).
  1265. ˘    *random-state* - the default random-state used by the random function.
  1266. ˘    *features* - list of features, initially (:xlisp), used for  #+ and #-
  1267.      reader macros.
  1268. ˘    *startup-functions*  - list of functions to be executed when workspace
  1269.      started
  1270. ˘    *command-line* -  the xlisp  command line,  in the form  of a  list of
  1271.      strings, one string per argument.
  1272. ˘    *load-file-arguments* - When  not NIL, file  arguements are loaded  at
  1273.      startup.
  1274. ˘    *top-level-loop* - Top  level loop to utilize,  defaults to TOP-LEVEL-
  1275.      LOOP. Note that this function can  only be restarted by executing TOP-
  1276.      LEVEL, and it never exits.
  1277. ˘    *read-suppress* -  When not  NIL, inhibits certain  parts of  reading.
  1278.      Used by the #+ and #- macroes.
  1279.  
  1280. There are  several  symbols maintained  by  the read/eval/print  loop.  The
  1281. symbols  '+', '++',  and '+++'  are bound  to the  most recent  three input
  1282. expressions. The symbols  '*', '**' and '***' are bound  to the most recent
  1283. three results. The  symbol '-' is  bound to the expression  currently being
  1284. evaluated. It becomes the value of '+' at the end of the evaluation.
  1285.  
  1286.  
  1287.  
  1288.  
  1289. XLISP 2.1g                  EVALUATION FUNCTIONS                    Page 25
  1290.  
  1291.  
  1292.  
  1293. EVALUATION FUNCTIONS
  1294.  
  1295. (eval <expr>)                                  EVALUATE AN XLISP EXPRESSION
  1296.      <expr>    the expression to be evaluated
  1297.      returns   the result of evaluating the expression
  1298.  
  1299. (apply <fun> <arg>...<args>)        APPLY A FUNCTION TO A LIST OF ARGUMENTS
  1300.      <fun>     the function to apply (or function symbol). May not be macro
  1301.                or fsubr.
  1302.      <arg>     initial arguments, which are CONSed to...
  1303.      <args>    the argument list
  1304.      returns   the result of applying the function to the arguments
  1305.  
  1306. (funcall <fun> <arg>...)                     CALL A FUNCTION WITH ARGUMENTS
  1307.      <fun>     the  function to call (or function symbol). May not be macro
  1308.                or fsubr.
  1309.      <arg>     arguments to pass to the function
  1310.      returns   the result of calling the function with the arguments
  1311.  
  1312. (quote <expr>)                             RETURN AN EXPRESSION UNEVALUATED
  1313.      fsubr
  1314.      <expr>    the expression to be quoted (quoted)
  1315.      returns   <expr> unevaluated
  1316.  
  1317. (function <expr>)                         GET THE FUNCTIONAL INTERPRETATION
  1318.      fsubr
  1319.      <expr>    the symbol or lambda expression (quoted)
  1320.      returns   the functional interpretation
  1321.  
  1322. (complement <fun>)                            MAKE A COMPLEMENTARY FUNCTION
  1323.      This  function is intended to eliminate the need for -IF-NOT functions
  1324.      and :TEST-NOT keys by providing a way to make complementary functions.
  1325.      <fun>     the function or closure (not macro or fsubr)
  1326.      returns   a new function closure that returns NOT of the result of the
  1327.                original function.
  1328.  
  1329. (identity <expr>)                                     RETURN THE EXPRESSION
  1330.      <expr>    the expression
  1331.      returns   the expression
  1332.  
  1333. (backquote <expr>)                                       FILL IN A TEMPLATE
  1334.      fsubr. Note: an improved backquote facility, which works properly when
  1335.      nested, is available by loading the file backquot.lsp.
  1336.      <expr>    the template (quoted)
  1337.      returns   a copy  of the template with comma  and comma-at expressions
  1338.                expanded.
  1339.  
  1340. (comma <expr>)                                             COMMA EXPRESSION
  1341.      (Never  executed)  As  the  object  of  a  backquote   expansion,  the
  1342.      expression is evaluated and becomes an object in the enclosing list.
  1343.  
  1344.  
  1345.  
  1346.  
  1347. XLISP 2.1g                  EVALUATION FUNCTIONS                    Page 26
  1348.  
  1349.  
  1350. (comma-at <expr>)                                       COMMA-AT EXPRESSION
  1351.      (Never  executed)   As  the  object  of  a  backquote  expansion,  the
  1352.      expression is  evaluated (and  must evaluate  to a  list) and is  then
  1353.      spliced into the enclosing list.
  1354.  
  1355. (lambda <args> <expr>...)                           MAKE A FUNCTION CLOSURE
  1356.      fsubr
  1357.      <args>    formal argument list (lambda list) (quoted)
  1358.      <expr>    expressions of the function body (quoted)
  1359.      returns   the function closure
  1360.  
  1361. (get-lambda-expression <closure>)                 GET THE LAMBDA EXPRESSION
  1362.      <closure> the closure
  1363.      returns   the original  lambda expression, or  NIL if  not a  closure.
  1364.                Second return  value  is  T  if  closure  has  a  non-global
  1365.                environment, and the third  return value is the name  of the
  1366.                closure.
  1367.  
  1368. (macroexpand <form>)                         RECURSIVELY EXPAND MACRO CALLS
  1369.      <form>    the form to expand
  1370.      returns   the macro expansion
  1371.  
  1372. (macroexpand-1 <form>)                                  EXPAND A MACRO CALL
  1373.      <form>    the macro call form
  1374.      returns   the macro expansion
  1375.  
  1376.  
  1377.  
  1378.  
  1379. XLISP 2.1g                MULTIPLE VALUE FUNCTIONS                  Page 27
  1380.  
  1381.  
  1382.  
  1383. MULTIPLE VALUE FUNCTIONS
  1384.  
  1385. XLISP-PLUS supports multiple return values (via a compilation option) as in
  1386. Common Lisp. Note  that most  FSUBR control structure  functions will  pass
  1387. back multiple return values, with the exceptions being PROG1 and PROG2.
  1388.  
  1389. (multiple-value-bind <varlist> <vform> [<form>...])
  1390.                                       BIND RETURN VALUES INTO LOCAL CONTEXT
  1391.      defined as macro in common.lsp
  1392.      <vform>   form to be evaluated
  1393.      <varlist> list of variables to bind to return values of vform
  1394.      <form>    forms  evaluated   sequentially,  as  in  LET,  using  local
  1395.                bindings
  1396.      returns   values of last form evaluated, or NIL if no forms
  1397.  
  1398. (multiple-value-call <fun> <form> ...)    COLLECT VALUES AND APPLY FUNCTION
  1399.      fsubr
  1400.      <fun>     function to apply
  1401.      <form>    forms, which are evaluated, with result values collected
  1402.      returns   result of applying fun to all of  the returned values of the
  1403.                forms
  1404.  
  1405. (multiple-value-list <form>)   COLLECT MULTIPLE RETURNED VALUES INTO A LIST
  1406.      defined as macro in common.lsp
  1407.      <form>    form to be evaluated
  1408.      returns   list of returned values
  1409.  
  1410. (multiple-value-prog1 <form> [<form> ...])      RETURN VALUES OF FIRST FORM
  1411.      fsubr
  1412.      <form>    one or more forms, which are evaluated sequentially
  1413.      returns   the result values of the first form
  1414.  
  1415. (multiple-value-setq <varlist> <form>)      BIND RETURN VALUES TO VARIABLES
  1416.      defined as macro in common.lsp
  1417.      <form>    form to be evaluated
  1418.      <varlist> list of variables to bind to return values of form
  1419.      returns   (undefined, implementation dependent)
  1420.  
  1421. (nth-value <index> <form>)                           EXTRACT A RETURN VALUE
  1422.      fsubr
  1423.      <index>   index into return values
  1424.      <form>    form which gets evaluated
  1425.      returns   the nth result value of exectuing the form
  1426.  
  1427. (values [<expr>])                                    RETURN MULTIPLE VALUES
  1428.      <expr>    expression(s) to be evaluated
  1429.      returns   each argument as a separate value
  1430.  
  1431. (values-list <list>)                       RETURN MULTIPLE VALUES FROM LIST
  1432.      defined in common.lsp
  1433.      <list>    a list
  1434.      returns   each list element as a separate value
  1435.  
  1436.  
  1437.  
  1438.  
  1439. XLISP 2.1g                    SYMBOL FUNCTIONS                      Page 28
  1440.  
  1441.  
  1442.  
  1443. SYMBOL FUNCTIONS
  1444.  
  1445. (set <sym> <expr>)                         SET THE GLOBAL VALUE OF A SYMBOL
  1446.      <sym>     the symbol being set
  1447.      <expr>    the new value
  1448.      returns   the new value
  1449.  
  1450. (setq [<sym> <expr>]...)                          SET THE VALUE OF A SYMBOL
  1451.      fsubr
  1452.      <sym>     the symbol being set (quoted)
  1453.      <expr>    the new value
  1454.      returns   the last new value or NIL if no arguments
  1455.  
  1456. (psetq [<sym> <expr>]...)                          PARALLEL VERSION OF SETQ
  1457.      fsubr. All  expressions are evaluated before  any assignments are
  1458.      made.
  1459.      <sym>     the symbol being set (quoted)
  1460.      <expr>    the new value
  1461.      returns   NIL
  1462.  
  1463. (setf [<place> <expr>]...)                         SET THE VALUE OF A FIELD
  1464.      fsubr
  1465.      <place> the field specifier  (if a macro it is expanded, then the form
  1466.              arguments are evaluated):
  1467.              <sym>                 set value of a symbol
  1468.              (car <expr>)          set car of a cons node
  1469.              (cdr <expr>)          set cdr of a cons node
  1470.              (nth <n> <expr>)      set nth car of a list
  1471.              (aref <expr> <n>)     set nth element of an array or string
  1472.              (elt <expr> <n>)      set nth element of a sequence
  1473.              (get <sym> <prop> [<dflt>])     set   value   of  a   symbol's
  1474.                                              property
  1475.              (getf <pl> <prop> [<dflt>])     set value of a  property. <pl>
  1476.                                              must   be    a   valid   field
  1477.                                              specifier.
  1478.              (symbol-value <sym>)  set global value of a symbol
  1479.              (symbol-function <sym>)         set  functional   value  of  a
  1480.                                              symbol
  1481.              (symbol-plist <sym>)  set property list of a symbol
  1482.              (gethash <key> <tbl> <def>)     add  or   replace  hash  table
  1483.              entry. <def> is ignored
  1484.              (send <obj> :<ivar>)  (When  classes.lsp  used), set  instance
  1485.                                    variable of object.
  1486.              (<sym>-<element> <struct>)      set  the element  of structure
  1487.                                              struct, type sym.
  1488.              (<fieldsym> <args>)   the function stored  in property  *setf*
  1489.                                    in  symbol  <fieldsym>  is   applied  to
  1490.                                    (<args> <expr>). As an  alternative, the
  1491.                                    function     stored      in     property
  1492.                                    *setf-lambda*    is  applied,  then  the
  1493.                                    result is evaled in the current context.
  1494.      <expr>  the new value
  1495.      returns the last new value, or NIL if no arguments
  1496.  
  1497.  
  1498.  
  1499.  
  1500. XLISP 2.1g                    SYMBOL FUNCTIONS                      Page 29
  1501.  
  1502.  
  1503. (psetf [<place> <expr>]...)                        PARALLEL VERSION OF SETF
  1504.      fsubr. All  expressions are evaluated  and macro place  forms expanded
  1505.      before any assignments are made.
  1506.      <place>   the field specifier (see SETF, above)
  1507.      <expr>    the new value
  1508.      returns   NIL
  1509.  
  1510. (defsetf <sym> <fcn>)                         DEFINE A SETF FIELD SPECIFIER
  1511. (defsetf <sym> <fargs> (<value>) <expr>...)
  1512.      Defined  as macro  in common.lsp.  Convenient, Common  Lisp compatible
  1513.      alternative to setting *setf* or *setf-lambda* property directly.
  1514.      <sym>     field specifier symbol (quoted)
  1515.      <fcn>     function  to  use  (quoted  symbol)  which  takes  the  same
  1516.                arguments as the field specifier plus an additional argument
  1517.                for the value. The value must be returned.
  1518.      <fargs>   formal argument list of unevaluated arguments (lambda  list)
  1519.                (quoted)
  1520.      <value>   symbol bound to value to store (quoted).
  1521.      <expr>    The last expression  must an expression  to evaluate in  the
  1522.                setf  context.In this  respect, defsetf  works like  a macro
  1523.                definition.
  1524.      returns   the field specifier symbol
  1525.  
  1526. (push  <expr> <place>)                                      CONS TO A FIELD
  1527.      Defined as macro  in common.lsp. Only  evaluates place form  arguments
  1528.      one time. It is recommended that *displace-macros* be non-NIL for best
  1529.      performance.
  1530.      <place>   field specifier being modified (see setf)
  1531.      <expr>    value to cons to field
  1532.      returns   the new value which is (CONS <expr> <place>)
  1533.  
  1534. (pushnew <expr> <place> &key :test :test-not :key)      CONS NEW TO A FIELD
  1535.      Defined  as macro in  common.lsp. Only evaluates  place form arguments
  1536.      one time. It is recommended that *displace-macros* be non-NIL for best
  1537.      performance.
  1538.      <place>   field specifier being modified (see setf)
  1539.      <expr>    value to cons to field, if not already MEMBER of field
  1540.      :test     the test function (defaults to eql)
  1541.      :test-not the test function (sense inverted)
  1542.      :key      function to  apply to test function  list argument (defaults
  1543.                to identity)
  1544.      returns   the new value which is (CONS <expr> <place>) or <place>
  1545.  
  1546. (pop <place>)                               REMOVE FIRST ELEMENT OF A FIELD
  1547.      Defined  as macro in  common.lsp. Only evaluates  place form arguments
  1548.      one time. It is recommended that *displace-macros* be non-NIL for best
  1549.      performance.
  1550.      <place>   the field being modified (see setf)
  1551.      returns   (CAR <place>), field changed to (CDR <place>)
  1552.  
  1553.  
  1554.  
  1555.  
  1556. XLISP 2.1g                    SYMBOL FUNCTIONS                      Page 30
  1557.  
  1558.  
  1559. (incf <place> [<value>])                                  INCREMENT A FIELD
  1560. (decf <place> [<value>])                                  DECREMENT A FIELD
  1561.      Defined as  macro in common.lsp.  Only evaluates place  form arguments
  1562.      one time. It is recommended that *displace-macros* be non-NIL for best
  1563.      performance.
  1564.      <place>   field specifier being modified (see setf)
  1565.      <value>   Numeric value (default 1)
  1566.      returns   the new value  which is  (+ <place> <value>)  or (-  <place>
  1567.                <value>)
  1568.  
  1569. (defun <sym> <fargs> <expr>...)                           DEFINE A FUNCTION
  1570. (defmacro <sym> <fargs> <expr>...)                           DEFINE A MACRO
  1571.      fsubr
  1572.      <sym>     symbol being defined (quoted)
  1573.      <fargs>   formal argument list (lambda list) (quoted)
  1574.      <expr>    expressions constituting the body of the function (quoted)
  1575.      returns   the function symbol
  1576.  
  1577. (gensym [<tag>])                                          GENERATE A SYMBOL
  1578.      <tag>     string or number
  1579.      returns   the new symbol, uninterned
  1580.  
  1581. (intern <pname> [<package>])                        MAKE AN INTERNED SYMBOL
  1582.      <pname>   the symbol's print name string
  1583.      <package> the package (defaults to current package)
  1584.      returns   the new symbol.  A second value is returned which  is NIL if
  1585.                the symbol did not pre-exist, :internal if it is an internal
  1586.                symbol, :external if it is an external symbol, or :inherited
  1587.                if it inherited via USE-PACKAGE.
  1588.  
  1589. (make-symbol <pname>)                             MAKE AN UNINTERNED SYMBOL
  1590.      <pname>   the symbol's print name string
  1591.      returns   the new symbol
  1592.  
  1593. (symbol-name <sym>)                          GET THE PRINT NAME OF A SYMBOL
  1594.      <sym>     the symbol
  1595.      returns   the symbol's print name
  1596.  
  1597. (symbol-value <sym>)                              GET THE VALUE OF A SYMBOL
  1598.      <sym>     the symbol
  1599.      returns   the symbol's value
  1600.  
  1601. (symbol-function <sym>)                GET THE FUNCTIONAL VALUE OF A SYMBOL
  1602.      <sym>     the symbol
  1603.      returns   the symbol's functional value
  1604.  
  1605. (symbol-plist <sym>)                      GET THE PROPERTY LIST OF A SYMBOL
  1606.      <sym>     the symbol
  1607.      returns   the symbol's property list
  1608.  
  1609. (hash <expr> <n>)                                    COMPUTE THE HASH INDEX
  1610.      <expr>    the object to hash
  1611.      <n>       the table size (positive integer)
  1612.      returns   the hash index (integer 0 to n-1)
  1613.  
  1614.  
  1615.  
  1616.  
  1617. XLISP 2.1g                    SYMBOL FUNCTIONS                      Page 31
  1618.  
  1619.  
  1620. (makunbound <sym>)                           MAKE A SYMBOL VALUE BE UNBOUND
  1621.      You cannot unbind constants.
  1622.      <sym>     the symbol
  1623.      returns   the symbol
  1624.  
  1625. (fmakunbound <sym>)                       MAKE A SYMBOL FUNCTION BE UNBOUND
  1626.      <sym>     the symbol
  1627.      returns   the symbol
  1628.  
  1629. (unintern <sym> [<package>])                              UNINTERN A SYMBOL
  1630.      Defined in common.lsp if package feature not compiled.
  1631.      <sym>     the symbol
  1632.      <package> the package to look in for the symbol
  1633.      returns   t if successful, NIL if symbol not interned
  1634.  
  1635. (defconstant <sym> <val> [<comment>])                     DEFINE A CONSTANT
  1636.      fsubr.
  1637.      <sym>     the symbol
  1638.      <val>     the value
  1639.      <comment> optional comment string (ignored)
  1640.      returns   the value
  1641.  
  1642. (defparameter <sym> <val> [<comment>])                   DEFINE A PARAMETER
  1643.      fsubr.
  1644.      <sym>     the symbol
  1645.      <val>     the value
  1646.      <comment> optional comment string (ignored)
  1647.      returns   the value
  1648.  
  1649. (defvar <sym> [<val> [<comment>]])                        DEFINE A VARIABLE
  1650.      fsubr. Variable only initialized if not previously defined.
  1651.      <sym>     the symbol
  1652.      <val>     the initial value, or NIL if absent.
  1653.      <comment> optional comment string (ignored)
  1654.      returns   the current value
  1655.  
  1656. (mark-as-special <sym> [<flag>])                      SET SPECIAL ATTRIBUTE
  1657.      Also see definition of PROCLAIM and DECLARE.
  1658.      <sym>     symbol to mark
  1659.      <flag>    non-nil to make into a constant
  1660.      returns   nil,  with  symbol  marked  as  special  and  possibly as  a
  1661.                constant.
  1662.  
  1663. (declare [<declaration> ...])                   DECLARE ARGUMENT ATTRIBUTES
  1664.      Macro  in  common.lsp  provided  to  assist  in  porting  Common  Lisp
  1665.      applications to XLISP-PLUS.
  1666.      <declaration>       list of local variable and attributes
  1667.      returns   nil, produces an error message if attribute SPECIAL is used.
  1668.  
  1669. (proclaim <proc>)                         PROCLAIM GLOBAL SYMBOL ATTRIBUTES
  1670.      Function in  common.lsp  provided to  assist  in porting  Common  Lisp
  1671.      applications to XLISP-PLUS.
  1672.      <proc>    a list of  symbols. If the CAR of the  list is SPECIAL, then
  1673.                the remaining symbols are marked as special variables.
  1674.  
  1675.  
  1676.  
  1677.  
  1678. XLISP 2.1g                   PACKAGE FUNCTIONS                      Page 32
  1679.  
  1680.  
  1681.  
  1682. PACKAGE FUNCTIONS
  1683.  
  1684. These  functions  are defined  when the  packages  option is  compiled. The
  1685. <package> argument can be either  a string, symbol, or package object.  The
  1686. default  when  no package  is given  is the  current  package (as  bound to
  1687. *package*),  unless otherwise  specified in  the definition.  The <symbols>
  1688. argument  may be either a  single symbol or  a list of symbols.  In case of
  1689. name conflicts, a correctable error occurs.
  1690.  
  1691. (apropos <string> [<package>])                SEARCH SYMBOLS FOR NAME MATCH
  1692. (apropos-list <string> [<package>])
  1693.      Functions in common.lsp.
  1694.      <string>  find symbols which contain this string as substring of print
  1695.                name
  1696.      <package> package to search, if absent, or NIL, search all packages
  1697.      returns   apropos-list returns  list of symbols, apropos  prints them,
  1698.                along with some information, and returns nothing.
  1699.  
  1700. (defpackage <package> [<option>...])                   (RE)DEFINE A PACKAGE
  1701.      Macro in common.lsp. Use to define a package, or redefine a package.
  1702.      <package> the name of the package to (re)define
  1703.      <option>  any one or more of the following, none evaluated, applied in
  1704.                this order:
  1705.      (:shadow <symbol>...)
  1706.                one or more symbols to shadow, as in function SHADOW
  1707.      (:shadowing-import-from <symbol>...)
  1708.                one   or   more   symbols   to  shadow,   as   in   function
  1709.                SHADOWING-IMPORT
  1710.      (:use <package>...)
  1711.                one or more packages to "use", as in function USE-PACKAGE
  1712.      (:import-from <package> <symbol>...)
  1713.                one  or more  symbols  to import  from  the package,  as  in
  1714.                function IMPORT
  1715.      (:intern <symbol>...)
  1716.                one  or  more  symbols to  be  located  or  created in  this
  1717.                package, as in function INTERN
  1718.      (:export <symbol>...)
  1719.                one or more symbols to be exported from this package,  as in
  1720.                function EXPORT
  1721.      returns   the new or redefined package
  1722.  
  1723. (delete-package <package>)                                 DELETE A PACKAGE
  1724.      Deletes  a package  by uninterning  all its  symbols and  removing the
  1725.      package.
  1726.      <package> package to delete
  1727.      returns   T if successful
  1728.  
  1729.  
  1730.  
  1731.  
  1732. XLISP 2.1g                   PACKAGE FUNCTIONS                      Page 33
  1733.  
  1734.  
  1735. (do-symbols (<var> [<package> [<result>]]) <expr>...)) ITERATE OVER SYMBOLS
  1736. (do-external-symbols (<var> [<package> [<result>]]) <expr>...)
  1737. (do-all-symbols (<var> [<result>]) <expr>...)
  1738.      Implemented  as macros  in  common.lsp. DO-SYMBOLS  iterates over  all
  1739.      symbols in  a single  package, DO-EXTERNAL-SYMBOLS iterates  only over
  1740.      the  external symbols, and DO-ALL-SYMBOLS iterates over all symbols in
  1741.      all packages.
  1742.      <var>     variable to bind to symbol
  1743.      <package> the package to search
  1744.      <result>  a single result form
  1745.      <expr>    expressions to evaluate (implicit tag-body)
  1746.      returns   result of result form, or NIL if not specified
  1747.  
  1748. (export <symbols> [<package>])                     DECLARE EXTERNAL SYMBOLS
  1749.      <symbols> symbols to declare as external
  1750.      <package> package symbol is in
  1751.      returns   T
  1752.  
  1753. (find-all-symbols <string>)                FIND SYMBOLS WITH SPECIFIED NAME
  1754.      <string>  string or symbol (if latter, print name string is used)
  1755.      returns   list of all symbols having that print-name
  1756.  
  1757. (find-package <package>)                   FIND PACKAGE WITH SPECIFIED NAME
  1758.      <package> package to find
  1759.      returns   package with name or nickname <package>, or NIL if not found
  1760.  
  1761. (find-symbol <string> [<package>])                         LOOK UP A SYMBOL
  1762.      <string>  print name to search for
  1763.      <package> package to search in
  1764.      returns   two values, the first being the symbol, and the second being
  1765.                :internal  if  the  symbol   is  internal  in  the  package,
  1766.                :external  if  it  is  external,  or  :inherited  if  it  is
  1767.                inherited via USE-PACKAGE. If the symbol was not found, then
  1768.                both return values are NIL.
  1769.  
  1770. (import <symbols> [<package>])                IMPORT SYMBOLS INTO A PACKAGE
  1771.      <symbols> symbols to import (fully qualified names)
  1772.      <package> package to import symbols into
  1773.      returns   T
  1774.  
  1775. (in-package <package>)                                  SET CURRENT PACKAGE
  1776.      FSUBR which sets the current package until next call or end of current
  1777.      LOAD.
  1778.      <package> the package to enter
  1779.      returns   the package
  1780.  
  1781. (list-all-packages)                                   GET ALL PACKAGE NAMES
  1782.      returns   list of all currently existing packages
  1783.  
  1784. (make-package <package> &key :nicknames :use)            MAKE A NEW PACKAGE
  1785.      <package> name of new package to create
  1786.      :nicknames          list of package nicknames
  1787.      :use      list of packages to use (as in USE-PACKAGE)
  1788.      returns   the new package
  1789.  
  1790.  
  1791.  
  1792.  
  1793. XLISP 2.1g                   PACKAGE FUNCTIONS                      Page 34
  1794.  
  1795.  
  1796. (package-name <package>)                            GET PACKAGE NAME STRING
  1797.      <package> package name
  1798.      returns   package name string
  1799.  
  1800. (package-nicknames <package>)                  GET PACKAGE NICKNAME STRINGS
  1801.      <package> package name
  1802.      returns   list of package nickname strings
  1803.  
  1804. (package-obarray <package> [<external>])                     GET AN OBARRAY
  1805.      <package> package to use
  1806.      <external>          non-nil  for  external   obarray,  else   internal
  1807.                          obarray (default)
  1808.      returns   the obarray (array of lists of symbols in package)
  1809.  
  1810. (package-shadowing-symbols <package>)         GET LIST OF SHADOWING SYMBOLS
  1811.      <package> the package
  1812.      returns   list of shadowing symbols in package
  1813.  
  1814. (package-use-list <package>)                 GET PACKAGES USED BY A PACKAGE
  1815.      <package> the package
  1816.      returns   list of packages used by this package (as in USE-PACKAGE)
  1817.  
  1818. (package-used-by-list <package>)         GET PACKAGES THAT USE THIS PACKAGE
  1819.      <package> the package
  1820.      returns   list of packages that use this package (as in USE-PACKAGE)
  1821.  
  1822. (package-valid-p <package>)                         IS THIS A GOOD PACKAGE?
  1823.      <package> object to check
  1824.      returns   T if a valid package, else NIL
  1825.  
  1826. (rename-package <package> <new> [<nick>])                  RENAME A PACKAGE
  1827.      <package> original package
  1828.      <new>     new package name (may be same as original name)
  1829.      <nick>    list of new package nicknames
  1830.      returns   the new package
  1831.  
  1832. (shadow <symbols> [<package>])                       MAKE SHADOWING SYMBOLS
  1833.      If a symbol is not already in  the package, it is interned. The symbol
  1834.      is placed in the shadowing symbols list for the package.
  1835.      <symbols> the symbol or symbols to shadow
  1836.      <package> package to put symbols in
  1837.      returns   T
  1838.  
  1839. (shadowing-import <symbols> [<package>])          IMPORT SYMBOLS AND SHADOW
  1840.      If a  symbol exists in the package, it is first uninterned. The symbol
  1841.      is imported, and then made shadowing.
  1842.      <symbols> the symbol or symbols to import and shadow
  1843.      <package> package to put symbols in
  1844.      returns   T
  1845.  
  1846. (symbol-package <symbol>)                      FIND THE PACKAGE OF A SYMBOL
  1847.      <symbol>  the symbol
  1848.      returns   the home package of the symbol, or NIL if none
  1849.  
  1850.  
  1851.  
  1852.  
  1853. XLISP 2.1g                   PACKAGE FUNCTIONS                      Page 35
  1854.  
  1855.  
  1856. (unexport <symbols> [<package>])           MAKE SYMBOLS INTERNAL TO PACKAGE
  1857.      <symbols> symbol or symbols to make internal
  1858.      <package> package for symbols
  1859.      returns   T
  1860.  
  1861. (unuse-package <pkgs> [<package>])            REMOVE PACKAGES FROM USE LIST
  1862.      <pkgs>    A single package or list of packages
  1863.      <package> Package  in which  to  un-use packages  (default is  current
  1864.                package)
  1865.      returns   T
  1866.  
  1867. (use-package <pkgs> [<package>])                   ADD PACKAGES TO USE LIST
  1868.      <pkgs>    A single package or list of packages
  1869.      <package> Package  in which  to  use packages  in (default  is current
  1870.                package)
  1871.      returns   T
  1872.  
  1873.  
  1874.  
  1875.  
  1876. XLISP 2.1g                PROPERTY LIST FUNCTIONS                   Page 36
  1877.  
  1878.  
  1879.  
  1880. PROPERTY LIST FUNCTIONS
  1881.  
  1882. Note that property names are not limited to symbols. All functions handle a
  1883. symbol's property  lists  except for  GETF  and REMF  which work  with  any
  1884. property list.
  1885.  
  1886. (get <sym> <prop> [<dflt>])            GET THE VALUE OF A SYMBOL'S PROPERTY
  1887.      Use SETF with GET to add or change properties.
  1888.      <sym>     the symbol
  1889.      <prop>    the property name
  1890.      <dflt>    value to return if property not found, default is NIL
  1891.      returns   the property value or <dflt> if property doesn't exist.
  1892.  
  1893. (getf <place> <prop> [<dflt>])                  GET THE VALUE OF A PROPERTY
  1894.      Use SETF with GETF to add or change  properties. (NOTE--when used with
  1895.      SETF,  <place> must  be a valid  place form.  It gets  executed twice,
  1896.      contrary to Common Lisp standard.)
  1897.      <place>   where the property list is stored
  1898.      <prop>    the property name
  1899.      <dflt>    value to return if property not found, default is NIL
  1900.      returns   the property value or <dflt> if property doesn't exist.
  1901.  
  1902. (putprop <sym> <val> <prop>)            PUT A PROPERTY ONTO A PROPERTY LIST
  1903.      Modern practice is to use (SETF (GET...)...) rather than PUTPROP.
  1904.      <sym>     the symbol
  1905.      <val>     the property value
  1906.      <prop>    the property name
  1907.      returns   the property value
  1908.  
  1909. (remf <place> <prop>)                                     DELETE A PROPERTY
  1910.      Defined as a macro in COMMON.LSP
  1911.      <place>   where the property list is stored
  1912.      <prop>    the property name
  1913.      returns   T if property existed, else NIL
  1914.  
  1915. (remprop <sym> <prop>)                           DELETE A SYMBOL'S PROPERTY
  1916.      <sym>     the symbol
  1917.      <prop>    the property name
  1918.      returns   NIL
  1919.  
  1920.  
  1921.  
  1922.  
  1923. XLISP 2.1g                  HASH TABLE FUNCTIONS                    Page 37
  1924.  
  1925.  
  1926.  
  1927. HASH TABLE FUNCTIONS
  1928.  
  1929. A hash table is implemented as an structure of type  hash-table. No general
  1930. accessing functions are provided, and hash tables print out using the angle
  1931. bracket  convention  (not  readable by  READ).  The  first  element is  the
  1932. comparison function.  The remaining  elements contain association  lists of
  1933. keys (that hash to the same value) and their data.
  1934.  
  1935. (make-hash-table &key :size :test)                        MAKE A HASH TABLE
  1936.      :size     size  of hash table -- should  be a prime number. Default is
  1937.                31.
  1938.      :test     comparison function. Defaults to eql.
  1939.      returns   the hash table
  1940.  
  1941. (gethash <key> <table> [<def>])                     EXTRACT FROM HASH TABLE
  1942.      See also gethash in SETF.
  1943.      <key>     hash key
  1944.      <table>   hash table
  1945.      <def>     value to return on no match (default is NIL)
  1946.      returns   associated data, if found, or <def> if not found.
  1947.  
  1948. (remhash <key> <table>)                              DELETE FROM HASH TABLE
  1949.      <key>     hash key
  1950.      <table>   hash table
  1951.      returns   T if deleted, NIL if not in table
  1952.  
  1953. (clrhash <table>)                                      CLEAR THE HASH TABLE
  1954.      <table>   hash table
  1955.      returns   NIL, all entries cleared from table
  1956.  
  1957. (hash-table-count <table>)                  NUMBER OF ENTRIES IN HASH TABLE
  1958.      <table>   hash table
  1959.      returns   integer number of entries in table
  1960.  
  1961. (maphash <fcn> <table>)                     MAP FUNCTION OVER TABLE ENTRIES
  1962.      <fcn>     the function or function name, a function of two  arguments,
  1963.                the first is  bound to the key, and the  second the value of
  1964.                each table entry in turn.
  1965.      <table>   hash table
  1966.      returns   NIL
  1967.  
  1968.  
  1969.  
  1970.  
  1971. XLISP 2.1g                    ARRAY FUNCTIONS                       Page 38
  1972.  
  1973.  
  1974.  
  1975. ARRAY FUNCTIONS
  1976.  
  1977. Note that sequence functions also work on arrays.
  1978.  
  1979. (aref <array> <n>)                          GET THE NTH ELEMENT OF AN ARRAY
  1980.      See setf for setting elements of arrays
  1981.      <array>   the array (or string)
  1982.      <n>       the array index (integer, zero based)
  1983.      returns   the value of the array element
  1984.  
  1985. (make-array <size> &key :initial-element :initial-contents)  MAKE A NEW ARRAY
  1986.      <size>    the size of the new array (integer)
  1987.      :initial-element
  1988.                value to initialize all array elements, default NIL
  1989.      :initial-contents
  1990.                sequence used to initialize  all array elements, consecutive
  1991.                sequence  elements  are used  for  each  array element.  The
  1992.                length  of the sequence must be the  same as the size of the
  1993.                array
  1994.      returns   the new array
  1995.  
  1996. (vector <expr>...)                               MAKE AN INITIALIZED VECTOR
  1997.      <expr>    the vector elements
  1998.      returns   the new vector
  1999.  
  2000.  
  2001.  
  2002.  
  2003. XLISP 2.1g                   SEQUENCE FUNCTIONS                     Page 39
  2004.  
  2005.  
  2006.  
  2007. SEQUENCE FUNCTIONS
  2008.  
  2009. These functions work on sequences -- lists, arrays, or strings.
  2010.  
  2011. (concatenate <type> <expr> ...)                       CONCATENATE SEQUENCES
  2012.      If result type is string, sequences must contain only characters.
  2013.      <type>    result type, one of CONS, LIST, ARRAY, or STRING
  2014.      <expr>    zero or more sequences to concatenate
  2015.      returns   a  sequence  which is  the  concatenation  of the  arguement
  2016.                sequences
  2017.  
  2018. (elt <expr> <n>)                          GET THE NTH ELEMENT OF A SEQUENCE
  2019.      <expr>    the sequence
  2020.      <n>       the index of element to return
  2021.      returns   the element if the index is in bounds, otherwise error
  2022.  
  2023. (map <type> <fcn> <expr> ...)         APPLY FUNCTION TO SUCCESSIVE ELEMENTS
  2024. (map-into <target> <fcn> [<expr> ...])
  2025.      <type>    result type, one of CONS, LIST, ARRAY, STRING, or NIL
  2026.      <target>  destination sequence to modify
  2027.      <fcn>     the function or function name
  2028.      <expr>    a sequence for each argument of the function
  2029.      returns   a  new sequence  of type  <type> for  MAP, and  <target> for
  2030.                MAP-INTO.
  2031.  
  2032. (every <fcn> <expr> ...)             APPLY FUNCTION TO ELEMENTS UNTIL FALSE
  2033. (notevery <fcn> <expr> ...)
  2034.      <fcn>     the function or function name
  2035.      <expr>    a sequence for each argument of the function
  2036.      returns   every returns last evaluated function result
  2037.                notevery returns T if  there is a NIL function  result, else
  2038.                NIL
  2039.  
  2040. (some <fcn> <expr> ...)               APPLY FUNCTION TO ELEMENTS UNTIL TRUE
  2041. (notany <fcn> <expr> ...)
  2042.      <fcn>     the function or function name
  2043.      <expr>    a sequence for each argument of the function
  2044.      returns   some returns first non-NIL function result, or NIL
  2045.                notany returns NIL  if there is  a non-NIL function  result,
  2046.                else T
  2047.  
  2048. (length <expr>)                               FIND THE LENGTH OF A SEQUENCE
  2049.      Note that a circular list causes  an error. To detect a circular list,
  2050.      use LIST-LENGTH.
  2051.      <expr>    the list, vector or string
  2052.      returns   the length of the list, vector or string
  2053.  
  2054. (reverse <expr>)                                         REVERSE A SEQUENCE
  2055. (nreverse <expr>)                          DESTRUCTIVELY REVERSE A SEQUENCE
  2056.      <expr>    the sequence to reverse
  2057.      returns   a new sequence in the reverse order
  2058.  
  2059.  
  2060.  
  2061.  
  2062. XLISP 2.1g                   SEQUENCE FUNCTIONS                     Page 40
  2063.  
  2064.  
  2065. (subseq <seq> <start> [<end>])                        EXTRACT A SUBSEQUENCE
  2066.      <seq>     the sequence
  2067.      <start>   the starting position (zero origin)
  2068.      <end>     the ending position + 1 (defaults to end) or NIL  for end of
  2069.                sequence
  2070.      returns   the sequence between <start> and <end>
  2071.  
  2072. (sort <seq> <test> &key :key)                 DESTRUCTIVELY SORT A SEQUENCE
  2073.      <seq>     the sequence to sort
  2074.      <test>    the comparison function
  2075.      :key      function to apply to comparison function arguments (defaults
  2076.                to identity)
  2077.      returns   the sorted sequence
  2078.  
  2079. (search <seq1>  <seq2>  &key :test  :test-not  :key :start1  :end1  :start2
  2080. :end2)
  2081.                                                         SEARCH FOR SEQUENCE
  2082.      <seq1>    the sequence to search for
  2083.      <seq2>    the sequence to search in
  2084.      :test     the test function (defaults to eql)
  2085.      :test-not the test function (sense inverted)
  2086.      :key      function to  apply to  test function arguments  (defaults to
  2087.                identity)
  2088.      :start1   starting index in <seq1>
  2089.      :end1     index of end+1 in <seq1> or NIL for end of sequence
  2090.      :start2   starting index in <seq2>
  2091.      :end2     index of end+1 in <seq2> or NIL for end of sequence
  2092.      returns   position of first match
  2093.  
  2094. (remove <expr> <seq> &key :test :test-not :key :start :end)
  2095.                                             REMOVE ELEMENTS FROM A SEQUENCE
  2096.      <expr>    the element to remove
  2097.      <seq>     the sequence
  2098.      :test     the test function (defaults to eql)
  2099.      :test-not the test function (sense inverted)
  2100.      :key      function  to  apply  to   test  function  sequence  argument
  2101.                (defaults to identity)
  2102.      :start    starting index
  2103.      :end      index of end+1, or NIL for (length <seq>)
  2104.      returns   copy of sequence with matching expressions removed
  2105.  
  2106. (remove-if <test> <seq> &key :key :start :end)
  2107.                                              REMOVE ELEMENTS THAT PASS TEST
  2108. (remove-if-not <test> <seq> &key :key :start :end)
  2109.                                              REMOVE ELEMENTS THAT FAIL TEST
  2110.      <test>    the test predicate
  2111.      <seq>     the sequence
  2112.      :key      function  to apply  to test  function argument  (defaults to
  2113.                identity)
  2114.      :start    starting index
  2115.      :end      index of end+1, or NIL for (length <seq>)
  2116.      returns   copy  of sequence  with  matching  or non-matching  elements
  2117.                removed
  2118.  
  2119.  
  2120.  
  2121.  
  2122. XLISP 2.1g                   SEQUENCE FUNCTIONS                     Page 41
  2123.  
  2124.  
  2125. (count <expr> <seq> &key :test :test-not :key :start :end)
  2126.                                       COUNT MATCHING ELEMENTS IN A SEQUENCE
  2127.      <expr>    element to count
  2128.      <seq>     the sequence
  2129.      :test     the test function (defaults to eql)
  2130.      :test-not the test function (sense inverted)
  2131.      :key      function  to  apply  to  each <seq>  argument  (defaults  to
  2132.                identity)
  2133.      :start    starting index
  2134.      :end      index of end+1, or NIL for (length <seq>)
  2135.      returns   count of matching elements
  2136.  
  2137. (count-if <test> <seq> &key :key :start :end)
  2138.                                               COUNT ELEMENTS THAT PASS TEST
  2139. (count-if-not <test> <seq> &key :key :start :end)
  2140.                                               COUNT ELEMENTS THAT FAIL TEST
  2141.      <test>    the test predicate
  2142.      <seq>     the sequence
  2143.      :key      function  to apply  to test  function argument  (defaults to
  2144.                identity)
  2145.      :start    starting index
  2146.      :end      index of end+1, or NIL for (length <seq>)
  2147.      returns   count of matching/non-matching elements
  2148.  
  2149. (find <expr> <seq> &key :test :test-not :key :start :end)
  2150.                                     FIND FIRST MATCHING ELEMENT IN SEQUENCE
  2151.      <expr>    element to search for
  2152.      <seq>     the sequence
  2153.      :test     the test function (defaults to eql)
  2154.      :test-not the test function (sense inverted)
  2155.      :key      function  to  apply  to  each <seq>  argument  (defaults  to
  2156.                identity)
  2157.      :start    starting index
  2158.      :end      index of end+1, or NIL for (length <seq>)
  2159.      returns   first matching element of sequence, or NIL
  2160.  
  2161. (find-if <test> <seq> &key :key :start :end)
  2162.                                         FIND FIRST ELEMENT THAT PASSES TEST
  2163. (find-if-not <test> <seq> &key :key :start :end)
  2164.                                          FIND FIRST ELEMENT THAT FAILS TEST
  2165.      <test>    the test predicate
  2166.      <seq>     the sequence
  2167.      :key      function  to apply  to test  function argument  (defaults to
  2168.                identity)
  2169.      :start    starting index
  2170.      :end      index of end+1, or NIL for (length <seq>)
  2171.      returns   first element of sequence that passes/fails test, or NIL
  2172.  
  2173.  
  2174.  
  2175.  
  2176. XLISP 2.1g                   SEQUENCE FUNCTIONS                     Page 42
  2177.  
  2178.  
  2179. (position <expr> <seq> &key :test :test-not :key :start :end)
  2180.                         FIND POSITION OF FIRST MATCHING ELEMENT IN SEQUENCE
  2181.      <expr>    element to search for
  2182.      <seq>     the sequence
  2183.      :test     the test function (defaults to eql)
  2184.      :test-not the test function (sense inverted)
  2185.      :key      function  to  apply  to  each <seq>  argument  (defaults  to
  2186.                identity)
  2187.      :start    starting index
  2188.      :end      index of end+1, or NIL for (length <seq>)
  2189.      returns   position of first matching element of sequence, or NIL
  2190.  
  2191. (position-if <test> <seq> &key :key :start :end)
  2192.                             FIND POSITION OF FIRST ELEMENT THAT PASSES TEST
  2193. (position-if-not <test> <seq> &key :key :start :end)
  2194.                          FIND POSITION OF FIRST ELEMENT THAT FAILS TEST
  2195.      <test>    the test predicate
  2196.      <seq>     the sequence
  2197.      :key      function  to apply  to test  function argument  (defaults to
  2198.                identity)
  2199.      :start    starting index
  2200.      :end      index of end+1, or NIL for (length <seq>)
  2201.      returns   position  of first  element  of sequence  that  passes/fails
  2202.                test, or NIL.
  2203.  
  2204. (delete <expr> <seq> &key :key :test :test-not :start :end)
  2205.                                             DELETE ELEMENTS FROM A SEQUENCE
  2206.      <expr>    the element to delete
  2207.      <seq>     the sequence
  2208.      :test     the test function (defaults to eql)
  2209.      :test-not the test function (sense inverted)
  2210.      :key      function   to  apply  to  test  function  sequence  argument
  2211.                (defaults to identity)
  2212.      :start    starting index
  2213.      :end      index of end+1, or NIL for (length <seq>)
  2214.      returns   the sequence with the matching expressions deleted
  2215.  
  2216. (delete-if <test> <seq> &key :key :start :end)
  2217.                                              DELETE ELEMENTS THAT PASS TEST
  2218. (delete-if-not <test> <seq> &key :key :start :end)
  2219.                                              DELETE ELEMENTS THAT FAIL TEST
  2220.      <test>    the test predicate
  2221.      <seq>     the sequence
  2222.      :key      function  to apply  to test  function argument  (defaults to
  2223.                identity)
  2224.      :start    starting index
  2225.      :end      index of end+1, or NIL for (length <seq>)
  2226.      returns   the sequence with matching or non-matching elements deleted
  2227.  
  2228.  
  2229.  
  2230.  
  2231. XLISP 2.1g                   SEQUENCE FUNCTIONS                     Page 43
  2232.  
  2233.  
  2234. (reduce <fcn> <seq> &key :initial-value :start :end)
  2235.                                             REDUCE SEQUENCE TO SINGLE VALUE
  2236.      <fcn>     function (of two  arguments) to apply to  result of previous
  2237.                function application  (or first element) and  each member of
  2238.                sequence.
  2239.      <seq>     the sequence
  2240.      :initial-value      value to  use as first argument  in first function
  2241.                          application rather than using the first element of
  2242.                          the sequence.
  2243.      :start    starting index
  2244.      :end      index of end+1, or NIL for (length <seq>)
  2245.      returns   if  sequence is empty and there is no initial value, returns
  2246.                result of applying function to zero  arguements. If there is
  2247.                a single element, returns the element. Otherwise returns the
  2248.                result of the last function application.
  2249.  
  2250. (remove-duplicates <seq> &key :test :test-not :key :start :end)
  2251.                                             REMOVE DUPLICATES FROM SEQUENCE
  2252.      <seq>     the sequence
  2253.      :test     comparison function (default eql)
  2254.      :test-not comparison function (sense inverted)
  2255.      :key      function to  apply to  test function arguments  (defaults to
  2256.                identity)
  2257.      :start    starting index
  2258.      :end      index of end+1, or NIL for (length <seq>)
  2259.      returns   copy of sequence with duplicates removed.
  2260.  
  2261. (fill <seq> <expr> &key :start :end)              REPLACE ITEMS IN SEQUENCE
  2262.      Defined in common.lsp
  2263.      <seq>     the sequence
  2264.      <expr>    new value to place in sequence
  2265.      :start    starting index
  2266.      :end      index of end+1, or NIL for (length <seq>)
  2267.      returns   sequence with items replaced with new item
  2268.  
  2269. (replace <seq1> <seq2> &key :start1 :end1 :start2 :end2)
  2270.                                     REPLACE ITEMS IN SEQUENCE FROM SEQUENCE
  2271.      Defined in common.lsp
  2272.      <seq1>    the sequence to modify
  2273.      <seq2>    sequence with new items
  2274.      :start1   starting index in <seq1>
  2275.      :end1     index of end+1 in <seq1> or NIL for end of sequence
  2276.      :start2   starting index in <seq2>
  2277.      :end2     index of end+1 in <seq2> or NIL for end of sequence
  2278.      returns   first sequence with items replaced
  2279.  
  2280.  
  2281.  
  2282.  
  2283. XLISP 2.1g                     LIST FUNCTIONS                       Page 44
  2284.  
  2285.  
  2286.  
  2287. LIST FUNCTIONS 
  2288.  
  2289. (car <expr>)                                  RETURN THE CAR OF A LIST NODE
  2290.      <expr>    the list node
  2291.      returns   the car of the list node
  2292.  
  2293. (cdr <expr>)                                  RETURN THE CDR OF A LIST NODE
  2294.      <expr>    the list node
  2295.      returns   the cdr of the list node
  2296.  
  2297. (cxxr <expr>)                                         ALL CxxR COMBINATIONS
  2298. (cxxxr <expr>)                                       ALL CxxxR COMBINATIONS
  2299. (cxxxxr <expr>)                                     ALL CxxxxR COMBINATIONS
  2300.  
  2301. (first <expr>)                                            A SYNONYM FOR CAR
  2302. (second <expr>)                                          A SYNONYM FOR CADR
  2303. (third <expr>)                                          A SYNONYM FOR CADDR
  2304. (fourth <expr>)                                        A SYNONYM FOR CADDDR
  2305. (rest <expr>)                                             A SYNONYM FOR CDR
  2306.  
  2307. (cons <expr1> <expr2>)                            CONSTRUCT A NEW LIST NODE
  2308.      <expr1>   the car of the new list node
  2309.      <expr2>   the cdr of the new list node
  2310.      returns   the new list node
  2311.  
  2312. (acons <expr1> <expr2> <alist>)                  ADD TO FRONT OF ASSOC LIST
  2313.      defined in common.lsp
  2314.      <expr1>   key of new association
  2315.      <expr2>   value of new association
  2316.      <alist>   association list
  2317.      returns   new association list, which  is (cons (cons <expr1> <expr2>)
  2318.                <expr3>))
  2319.  
  2320. (list <expr>...)                                    CREATE A LIST OF VALUES
  2321. (list* <expr> ... <list>)
  2322.      <expr>    expressions to be combined into a list
  2323.      returns   the new list
  2324.  
  2325. (append <expr>...)                                             APPEND LISTS
  2326.      <expr>    lists whose elements are to be appended
  2327.      returns   the new list
  2328.  
  2329. (list-length <list>)                              FIND THE LENGTH OF A LIST
  2330.      <list>    the list
  2331.      returns   the length of the list or NIL if the list is circular
  2332.  
  2333. (last <list>)                           RETURN THE LAST LIST NODE OF A LIST
  2334.      <list>    the list
  2335.      returns   the last list node in the list
  2336.  
  2337. (butlast <list> [<n>])                  RETURN COPY OF ALL BUT LAST OF LIST
  2338.      <list>    the list
  2339.      <n>       count of elements to omit (default 1)
  2340.      returns   copy of list with last element(s) absent.
  2341.  
  2342.  
  2343.  
  2344.  
  2345. XLISP 2.1g                     LIST FUNCTIONS                       Page 45
  2346.  
  2347.  
  2348. (nth <n> <list>)                           RETURN THE NTH ELEMENT OF A LIST
  2349.      <n>       the number of the element to return (zero origin)
  2350.      <list>    the list
  2351.      returns   the nth element or NIL if the list isn't that long
  2352.  
  2353. (nthcdr <n> <list>)                            RETURN THE NTH CDR OF A LIST
  2354.      <n>       the number of the element to return (zero origin)
  2355.      <list>    the list
  2356.      returns   the nth cdr or NIL if the list isn't that long
  2357.  
  2358. (member <expr> <list> &key :test :test-not :key)
  2359.                                                FIND AN EXPRESSION IN A LIST
  2360.      <expr>    the expression to find
  2361.      <list>    the list to search
  2362.      :test     the test function (defaults to eql)
  2363.      :test-not the test function (sense inverted)
  2364.      :key      function to  apply to test function  list argument (defaults
  2365.                to identity)
  2366.      returns   the remainder of the list starting with the expression
  2367.  
  2368. (assoc <expr> <alist> &key :test :test-not :key)
  2369.                                             FIND AN EXPRESSION IN AN A-LIST
  2370.      <expr>    the expression to find
  2371.      <alist>   the association list
  2372.      :test     the test function (defaults to eql)
  2373.      :test-not the test function (sense inverted)
  2374.      :key      function to  apply to test function  list argument (defaults
  2375.                to identity)
  2376.      returns   the alist entry or NIL
  2377.  
  2378. (mapc <fcn> <list1> <list>...)            APPLY FUNCTION TO SUCCESSIVE CARS
  2379.      <fcn>     the function or function name
  2380.      <listn>   a list for each argument of the function
  2381.      returns   the first list of arguments
  2382.  
  2383. (mapcar <fcn> <list1> <list>...)          APPLY FUNCTION TO SUCCESSIVE CARS
  2384.      <fcn>     the function or function name
  2385.      <listn>   a list for each argument of the function
  2386.      returns   a list of the values returned
  2387.  
  2388. (mapl <fcn> <list1> <list>...)            APPLY FUNCTION TO SUCCESSIVE CDRS
  2389.      <fcn>     the function or function name
  2390.      <listn>   a list for each argument of the function
  2391.      returns   the first list of arguments
  2392.  
  2393. (maplist <fcn> <list1> <list>...)         APPLY FUNCTION TO SUCCESSIVE CDRS
  2394.      <fcn>     the function or function name
  2395.      <listn>   a list for each argument of the function
  2396.      returns   a list of the values returned
  2397.  
  2398. (mapcan <fcn> <list1> <list>...)           APPL FUNCTION TO SUCCESSIVE CARS
  2399.      <fcn>     the function or function name
  2400.      <listn>   a list for each argument of the function
  2401.      returns   list of return values nconc'd together
  2402.  
  2403.  
  2404.  
  2405.  
  2406. XLISP 2.1g                     LIST FUNCTIONS                       Page 46
  2407.  
  2408.  
  2409. (mapcon <fcn> <list1> <list>...)           APPL FUNCTION TO SUCCESSIVE CDRS
  2410.      <fcn>     the function or function name
  2411.      <listn>   a list for each argument of the function
  2412.      returns   list of return values nconc'd together
  2413.  
  2414. (subst <to> <from> <expr> &key :test :test-not :key)
  2415. (nsubst <to> <from> <expr> &key :test :test-not :key)
  2416.                                                      SUBSTITUTE EXPRESSIONS
  2417.      SUBST does minimum  copying as required by Common Lisp.  NSUBST is the
  2418.      destructive version.
  2419.      <to>      the new expression
  2420.      <from>    the old expression
  2421.      <expr>    the expression in which to do the substitutions
  2422.      :test     the test function (defaults to eql)
  2423.      :test-not the test function (sense inverted)
  2424.      :key      function  to  apply  to  subtree  test  function  expression
  2425.                argument (defaults to identity)
  2426.      returns   the expression with substitutions
  2427.  
  2428. (sublis <alist> <expr> &key :test :test-not :key)
  2429. (nsublis <alist> <expr> &key :test :test-not :key)
  2430.                                                   SUBSTITUTE WITH AN A-LIST
  2431.      SUBLIS does minimum copying as required by Common Lisp. NSUBLIS is the
  2432.      destructive version.
  2433.      <alist>   the association list
  2434.      <expr>    the expression in which to do the substitutions
  2435.      :test     the test function (defaults to eql)
  2436.      :test-not the test function (sense inverted)
  2437.      :key      function  to  apply  to  subtree  test  function  expression
  2438.                argument (defaults to identity)
  2439.      returns   the expression with substitutions
  2440.  
  2441. (pairlis <keys> <values> [<alist>])          BUILD AN A-LIST FROM TWO LISTS
  2442.      In file common.lsp
  2443.      <keys>    list of association keys
  2444.      <values>  list of association values, same length as keys
  2445.      <alist>   existing association list, default NIL
  2446.      returns   new association list
  2447.  
  2448. (copy-list <list>)                             COPY THE TOP LEVEL OF A LIST
  2449.      In file common.lsp
  2450.      <list>    the list
  2451.      returns   a copy of the list (new cons cells in top level)
  2452.  
  2453. (copy-alist <alist>)                               COPY AN ASSOCIATION LIST
  2454.      In file common.lsp
  2455.      <alist>   the association list
  2456.      returns   a copy of the association list (keys and values not copies)
  2457.  
  2458. (copy-tree <tree>)                                              COPY A TREE
  2459.      In file common.lsp
  2460.      <tree>    a tree structure of cons cells
  2461.      returns   a copy of the tree structure
  2462.  
  2463.  
  2464.  
  2465.  
  2466. XLISP 2.1g                     LIST FUNCTIONS                       Page 47
  2467.  
  2468.  
  2469. (intersection <list1> <list2> &key :test :test-not :key)      SET FUNCTIONS
  2470. (union <list1> <list2> &key :test :test-not :key)
  2471. (set-difference <list1> <list2> &key :test :test-not :key)
  2472. (set-exclusive-or <list1> <list2> &key :test :test-not :key)
  2473. (nintersection <list1> <list2> &key :test :test-not :key)
  2474. (nunion <list1> <list2> &key :test :test-not :key)
  2475. (nset-difference <list1> <list2> &key :test :test-not :key)
  2476. (nset-exclusive-or <list1> <list2> &key :test :test-not :key)
  2477.      set-exclusive-or and nset-exclusive-or defined in  common.lsp. nunion,
  2478.      nintersection,    and   nset-difference    are   aliased    to   their
  2479.      non-destructive counterparts in common.lsp.
  2480.      <list1>   first list
  2481.      <list2>   second list
  2482.      :test     the test function (defaults to eql)
  2483.      :test-not the test function (sense inverted)
  2484.      :key      function to  apply to  test function arguments  (defaults to
  2485.                identity)
  2486.      returns   intersection: list of all elements in both lists
  2487.                union: list of all elements in either list
  2488.                set-diference: list of all elements in first list but not in
  2489.                second list
  2490.                set-exclusive-or: list of all elements in only one list
  2491.                "n" versions are potentially destructive.
  2492.  
  2493. (adjoin <expr> <list> :test :test-not :key)              ADD UNIQUE TO LIST
  2494.      <expr>    new element to add
  2495.      <list>    the list
  2496.      :test     the test function (defaults to eql)
  2497.      :test-not the test function <sense inverted)
  2498.      :key      function to  apply to  test function arguments  (defaults to
  2499.                identity)
  2500.      returns   if  element not  in  list then  (cons  <expr> <list>),  else
  2501.                <list>.
  2502.  
  2503.  
  2504.  
  2505.  
  2506. XLISP 2.1g               DESTRUCTIVE LIST FUNCTIONS                 Page 48
  2507.  
  2508.  
  2509.  
  2510. DESTRUCTIVE LIST FUNCTIONS
  2511.  
  2512. Destructive functions that have  non-desctructive equivalents are listed in
  2513. other  sections.   See  also sort,  map-into, nreverse,  delete, delete-if,
  2514. delete-if-not,  fill,  and replace  under  SEQUENCE  FUNCTIONS, setf  under
  2515. SYMBOL  FUNCTIONS,  and  mapcan,  mapcon,  nsubst, nsublis,  nintersection,
  2516. nunion, nset-difference, and nset-exclusive-or under LIST FUNCTIONS.
  2517.  
  2518. (rplaca <list> <expr>)                       REPLACE THE CAR OF A LIST NODE
  2519.      <list>    the list node
  2520.      <expr>    the new value for the car of the list node
  2521.      returns   the list node after updating the car
  2522.  
  2523. (rplacd <list> <expr>)                       REPLACE THE CDR OF A LIST NODE
  2524.      <list>    the list node
  2525.      <expr>    the new value for the cdr of the list node
  2526.      returns   the list node after updating the cdr
  2527.  
  2528. (nconc <list>...)                           DESTRUCTIVELY CONCATENATE LISTS
  2529.      <list>    lists to concatenate
  2530.      returns   the result of concatenating the lists
  2531.  
  2532. (nsubst-if <to> <test> <expr> &key :key)
  2533. (nsubst-if-not <to> <test> <expr> &key :key)
  2534.                                                      SUBSTITUTE EXPRESSIONS
  2535.      <to>      the new expression
  2536.      <test>    function of one argument to test each subtree
  2537.      <expr>    the expression in which to do the substitutions
  2538.      :key      function  to apply  to test  function argument  (defaults to
  2539.                identity)
  2540.      returns   the expression with substitutions
  2541.  
  2542.  
  2543.  
  2544.  
  2545. XLISP 2.1g                  ARITHMETIC FUNCTIONS                    Page 49
  2546.  
  2547.  
  2548.  
  2549. ARITHMETIC FUNCTIONS
  2550.  
  2551. Warning: integer and ratio calculations that overflow become floating point
  2552. values  as part  of the  math extension,  but give  no error  otherwise. On
  2553. systems  with IEEE  floating point, the  values +INF  and -INF  result from
  2554. overflowing floating point calculations.
  2555.  
  2556. The  math extension option adds complex numbers, ratios, new functions, and
  2557. additional functionality to some existing functions. Because of the size of
  2558. the extension, and the performance loss it entails, some users may not wish
  2559. to include  it. This  section documents the  math functions  both with  and
  2560. without the extension.
  2561.  
  2562. Functions  that are described as  having floating point  arguments (SIN COS
  2563. TAN ASIN ACOS  ATAN EXPT EXP SQRT) will take arguments of any type (real or
  2564. complex)  when the math extension  is used. In  the descriptions, "rational
  2565. number"  means integer  or ratio   only, and  "real number"  means floating
  2566. point number or rational only.
  2567.  
  2568. Any  rational  results  are reduced  to  canonical  form  (the  gcd of  the
  2569. numerator  and  denominator is  1, the  denominator is  positive); integral
  2570. results  are  reduced  to  integers.  Integer  complex  numbers  with  zero
  2571. imaginary parts are reduced to integers.
  2572.  
  2573. (truncate <expr> <denom>)                             TRUNCATES TOWARD ZERO
  2574. (round <expr> <denom>)                   ROUNDS TOWARD NEAREST EVEN INTEGER
  2575. (floor <expr> <denom>)                   TRUNCATES TOWARD NEGATIVE INFINITY
  2576. (ceiling <expr> <denom>)                          TRUNCATES TOWARD INFINITY
  2577.      Round,  floor, and ceiling, and  the second argument  of truncate, are
  2578.      part  of the  math extension.  Results too  big to  be represented  as
  2579.      integers are returned  as floating point numbers  as part of the  math
  2580.      extension. Integers are returned as is.
  2581.      <expr>    the real number
  2582.      <denom>   real number to divide <expr> by before converting
  2583.      returns   the integer  result  of converting  the  number, and,  as  a
  2584.                second return value, the remainder of the operation, defined
  2585.                as expr - result*denom. the type is float if either argument
  2586.                is float, otherwise it is rational.
  2587.  
  2588. (float <expr>)               CONVERTS AN INTEGER TO A FLOATING POINT NUMBER
  2589.      <expr>    the real number
  2590.      returns   the number as a floating point number
  2591.  
  2592. (rational <expr>)                      CONVERTS A REAL NUMBER TO A RATIONAL
  2593.      Floating  point numbers too large to express return the floating point
  2594.      number,  while numbers  too  small to  express  return zero.  Rational
  2595.      numbers are returned as is.
  2596.      <expr>    the real number
  2597.      returns   the number as a ratio or integer. 
  2598.  
  2599. (+ [<expr>...])                                       ADD A LIST OF NUMBERS
  2600.      With no arguments returns addition identity, 0 (integer)
  2601.      <expr>    the numbers
  2602.      returns   the result of the addition
  2603.  
  2604.  
  2605.  
  2606.  
  2607. XLISP 2.1g                  ARITHMETIC FUNCTIONS                    Page 50
  2608.  
  2609.  
  2610. (- <expr>...)          SUBTRACT A LIST OF NUMBERS OR NEGATE A SINGLE NUMBER
  2611.      <expr>    the numbers
  2612.      returns   the result of the subtraction
  2613.  
  2614. (* [<expr>...])                                  MULTIPLY A LIST OF NUMBERS
  2615.      With no arguments returns multiplication identity, 1
  2616.      <expr>    the numbers
  2617.      returns   the result of the multiplication
  2618.  
  2619. (/ <expr>...)            DIVIDE A LIST OF NUMBERS OR INVERT A SINGLE NUMBER
  2620.      With  the math  extension, division  of integer  numbers results  in a
  2621.      rational quotient,  rather than integer. To  perform integer division,
  2622.      use TRUNCATE.  When an integer complex  is divided by  an integer, the
  2623.      quotient is floating point complex.
  2624.      <expr>    the numbers
  2625.      returns   the result of the division
  2626.  
  2627. (1+ <expr>)                                             ADD ONE TO A NUMBER
  2628.      <expr>    the number
  2629.      returns   the number plus one
  2630.  
  2631. (1- <expr>)                                      SUBTRACT ONE FROM A NUMBER
  2632.      <expr>    the number
  2633.      returns   the number minus one
  2634.  
  2635. (rem <expr>...)                              REMAINDER OF A LIST OF NUMBERS
  2636.      With the math extension, only two arguments allowed.
  2637.      <expr>    the real numbers (must be integers, without math extension)
  2638.      returns   the  result  of  the  remainder  operation  (remainder  with
  2639.                truncating division)
  2640.  
  2641. (mod <expr1> <expr2>)                          NUMBER MODULO ANOTHER NUMBER
  2642.      Part of math extension.
  2643.      <expr1>   real number
  2644.      <expr2>   real number divisor (may not be zero)
  2645.      returns   the  remainder  after  dividing  <expr1>  by  <expr2>  using
  2646.                flooring  division, thus  there is  no discontinuity  in the
  2647.                function around zero.
  2648.  
  2649. (min <expr>...)                           THE SMALLEST OF A LIST OF NUMBERS
  2650.      <expr>    the real numbers
  2651.      returns   the smallest number in the list
  2652.  
  2653. (max <expr>...)                            THE LARGEST OF A LIST OF NUMBERS
  2654.      <expr>    the real numbers
  2655.      returns   the largest number in the list
  2656.  
  2657. (abs <expr>)                                 THE ABSOLUTE VALUE OF A NUMBER
  2658.      <expr>    the number
  2659.      returns   the  absolute value  of  the number,  which is  the floating
  2660.                point magnitude for complex numbers.
  2661.  
  2662.  
  2663.  
  2664.  
  2665. XLISP 2.1g                  ARITHMETIC FUNCTIONS                    Page 51
  2666.  
  2667.  
  2668. (signum <expr>)                                    GET THE SIGN OF A NUMBER
  2669.      Defined in common.lsp
  2670.      <expr>    the number
  2671.      returns   zero if number is zero, one  if positive, or negative one if
  2672.                negative.  Numeric type  is  same as  number. For  a complex
  2673.                number, returns unit magnitude but same phase as number.
  2674.  
  2675. (gcd [<n>...])                          COMPUTE THE GREATEST COMMON DIVISOR
  2676.      With no arguments returns 0, with one argument returns the argument.
  2677.      <n>       The number(s) (integer)
  2678.      returns   the greatest common divisor
  2679.  
  2680. (lcm <n>...)                              COMPUTE THE LEAST COMMON MULTIPLE
  2681.      Part  of  math extension.  A result  which  would be  larger  than the
  2682.      largest integer causes an error.
  2683.      <n>       The number(s) (integer)
  2684.      returns   the least common multiple
  2685.  
  2686. (random <n> [<state>])                       COMPUTE A PSEUDO-RANDOM NUMBER
  2687.      <n>       the real number upper bound
  2688.      <state>   a random-state (default is *random-state*)
  2689.      returns   a random number in range [0,n)
  2690.  
  2691. (make-random-state [<state>])                         CREATE A RANDOM-STATE
  2692.      <state>   a  random-state,   t,  or  NIL  (default   NIL).  NIL  means
  2693.                *random-state*
  2694.      returns   If  <state> is t, a random random-state, otherwise a copy of
  2695.                <state>
  2696.  
  2697. (sin <expr>)                                   COMPUTE THE SINE OF A NUMBER
  2698. (cos <expr>)                                 COMPUTE THE COSINE OF A NUMBER
  2699. (tan <expr>)                                COMPUTE THE TANGENT OF A NUMBER
  2700. (asin <expr>)                              COMPUTE THE ARC SINE OF A NUMBER
  2701. (acos <expr>)                            COMPUTE THE ARC COSINE OF A NUMBER
  2702.      <expr>    the floating point number
  2703.      returns   the  sine, cosine, tangent, arc  sine, or arc  cosine of the
  2704.                number
  2705.  
  2706. (atan <expr> [<expr2>])                 COMPUTE THE ARC TANGENT OF A NUMBER
  2707.      <expr>    the floating point number (numerator)
  2708.      <expr2>   the denominator,  default 1. May  only be specified  if math
  2709.                extension installed
  2710.      returns   the arc tangent of <expr>/<expr2>
  2711.  
  2712. (sinh <expr>)                       COMPUTE THE HYPERBOLIC SINE OF A NUMBER
  2713. (cosh <expr>)                     COMPUTE THE HYPERBOLIC COSINE OF A NUMBER
  2714. (tanh <expr>)                    COMPUTE THE HYPERBOLIC TANGENT OF A NUMBER
  2715. (asinh <expr>)                  COMPUTE THE HYPERBOLIC ARC SINE OF A NUMBER
  2716. (acosh <expr>)                COMPUTE THE HYPERBOLIC ARC COSINE OF A NUMBER
  2717. (atanh <expr>)               COMPUTE THE HYPERBOLIC ARC TANGENT OF A NUMBER
  2718.      Defined in common.lsp
  2719.      <expr>    the number
  2720.      returns   the hyperbolic sine, cosine,  tangent, arc sine, arc cosine,
  2721.                or arc tangent of the number.
  2722.  
  2723.  
  2724.  
  2725.  
  2726. XLISP 2.1g                  ARITHMETIC FUNCTIONS                    Page 52
  2727.  
  2728.  
  2729. (expt <x-expr> <y-expr>)                           COMPUTE X TO THE Y POWER
  2730.      <x-expr>  the number 
  2731.      <y-expr>  the exponent 
  2732.      returns   x to the y power. If y is a fixnum, then  the result type is
  2733.                the same  as the type  of x, unless  fixnum or ratio  and it
  2734.                would overflow, then the result type is a flonum.
  2735.  
  2736. (exp <x-expr>)                                     COMPUTE E TO THE X POWER
  2737.      <x-expr>  the floating point number 
  2738.      returns   e to the x power
  2739.  
  2740. (cis <x-expr>)                                      COMPUTE COSINE + I SINE
  2741.      Defined in common.lsp
  2742.      <x-expr>  the number
  2743.      returns   e to the ix power
  2744.  
  2745. (log <expr> [<base>])                                  COMPUTE THE LOGRITHM
  2746.      Part of the math extension
  2747.      <expr>    the number
  2748.      <base>    the base, default is e
  2749.      returns   log base <base> of <expr>
  2750.  
  2751. (sqrt <expr>)                           COMPUTE THE SQUARE ROOT OF A NUMBER
  2752.      <expr>    the number 
  2753.      returns   the square root of the number
  2754.  
  2755. (numerator <expr>)                            GET THE NUMERATOR OF A NUMBER
  2756.      Part of math extension
  2757.      <expr>    rational number
  2758.      returns   numerator of number (number if integer)
  2759.  
  2760. (denominator <expr>)                        GET THE DENOMINATOR OF A NUMBER
  2761.      Part of math extension
  2762.      <expr>    rational number
  2763.      returns   denominator of number (1 if integer)
  2764.  
  2765. (complex <real> [<imag>])                         CONVERT TO COMPLEX NUMBER
  2766.      Part of math extension
  2767.      <real>    real number real part
  2768.      <imag>    real number imaginary part (default 0)
  2769.      returns   the complex number
  2770.  
  2771. (realpart <expr>)                             GET THE REAL PART OF A NUMBER
  2772.      Part of the math extension
  2773.      <expr>    the number
  2774.      returns   the real part of a complex number, or the number itself if a
  2775.      real number
  2776.  
  2777. (imagpart <expr>)                        GET THE IMAGINARY PART OF A NUMBER
  2778.      Part of the math extension
  2779.      <expr>    the number
  2780.      returns   the imaginary part  of a complex number, or zero of the type
  2781.                of the number if a real number.
  2782.  
  2783.  
  2784.  
  2785.  
  2786. XLISP 2.1g                  ARITHMETIC FUNCTIONS                    Page 53
  2787.  
  2788.  
  2789. (conjugate <expr>)                            GET THE CONJUGATE OF A NUMBER
  2790.      Part of the math extension
  2791.      <expr>    the number
  2792.      returns   the conjugate of a complex number, or the number itself if a
  2793.      real number.
  2794.  
  2795. (phase <expr>)                                    GET THE PHASE OF A NUMBER
  2796.      Part of the math extension
  2797.      <expr>    the number
  2798.      returns   the  phase  angle,  equivalent to  (atan  (imagpart  <expr>)
  2799.                (realpart <expr>))
  2800.  
  2801. (< <n1> <n2>...)                                         TEST FOR LESS THAN
  2802. (<= <n1> <n2>...)                            TEST FOR LESS THAN OR EQUAL TO
  2803. (= <n1> <n2>...)                                          TEST FOR EQUAL TO
  2804. (/= <n1> <n2>...)                                     TEST FOR NOT EQUAL TO
  2805. (>= <n1> <n2>...)                         TEST FOR GREATER THAN OR EQUAL TO
  2806. (> <n1> <n2>...)                                      TEST FOR GREATER THAN
  2807.      <n1>      the first real number to compare
  2808.      <n2>      the second real number to compare
  2809.      returns   the result of comparing <n1> with <n2>...
  2810.  
  2811.  
  2812.  
  2813.  
  2814. XLISP 2.1g               BITWISE LOGICAL FUNCTIONS                  Page 54
  2815.  
  2816.  
  2817.  
  2818. BITWISE LOGICAL FUNCTIONS
  2819.  
  2820. (logand [<expr>...])                  THE BITWISE AND OF A LIST OF INTEGERS
  2821.      With no arguments returns identity -1
  2822.      <expr>    the integers
  2823.      returns   the result of the and operation
  2824.  
  2825. (logior [<expr>...])         THE BITWISE INCLUSIVE OR OF A LIST OF INTEGERS
  2826.      With no arguments returns identity 0
  2827.      <expr>    the integers
  2828.      returns   the result of the inclusive or operation
  2829.  
  2830. (logxor [<expr>...])         THE BITWISE EXCLUSIVE OR OF A LIST OF INTEGERS
  2831.      With no arguments returns identity 0
  2832.      <expr>    the integers
  2833.      returns   the result of the exclusive or operation
  2834.  
  2835. (lognot <expr>)                                THE BITWISE NOT OF A INTEGER
  2836.      <expr>    the integer
  2837.      returns   the bitwise inversion of integer
  2838.  
  2839. (logtest <expr1> <expr2>)                  TEST BITWISE AND OF TWO INTEGERS
  2840.      Defined in common.lsp
  2841.      <expr1>   the first integer
  2842.      <expr2>   the second integer
  2843.      returns   T if the result of the and operation is non-zero, else NIL
  2844.  
  2845. (ash <expr1> <expr2>)                                      ARITHMETIC SHIFT
  2846.      Part of math extension
  2847.      <expr1>   integer to shift
  2848.      <expr2>   number of bit positions to shift (positive is to left)
  2849.      returns   shifted integer
  2850.  
  2851.  
  2852.  
  2853.  
  2854. XLISP 2.1g                    STRING FUNCTIONS                      Page 55
  2855.  
  2856.  
  2857.  
  2858. STRING FUNCTIONS
  2859.  
  2860. Note: functions with names starting "string"  will also accept a symbol, in
  2861. which case the symbol's print name is used.
  2862.  
  2863. (string <expr>)                   MAKE A STRING FROM AN INTEGER ASCII VALUE
  2864.      <expr>    an  integer  (which  is   first  converted  into  its  ASCII
  2865.                character value), string, character, or symbol
  2866.      returns   the string representation of the argument
  2867.  
  2868. (string-trim <bag> <str>)                        TRIM BOTH ENDS OF A STRING
  2869.      <bag>     a string containing characters to trim
  2870.      <str>     the string to trim
  2871.      returns   a trimed copy of the string
  2872.  
  2873. (string-left-trim <bag> <str>)                TRIM THE LEFT END OF A STRING
  2874.      <bag>     a string containing characters to trim
  2875.      <str>     the string to trim
  2876.      returns   a trimed copy of the string
  2877.  
  2878. (string-right-trim <bag> <str>)              TRIM THE RIGHT END OF A STRING
  2879.      <bag>     a string containing characters to trim
  2880.      <str>     the string to trim
  2881.      returns   a trimed copy of the string
  2882.  
  2883. (string-upcase <str> &key :start :end)                 CONVERT TO UPPERCASE
  2884.      <str>     the string
  2885.      :start    the starting offset
  2886.      :end      the ending offset + 1 or NIL for end of string
  2887.      returns   a converted copy of the string
  2888.  
  2889. (string-downcase <str> &key :start :end)               CONVERT TO LOWERCASE
  2890.      <str>     the string
  2891.      :start    the starting offset
  2892.      :end      the ending offset + 1 or NIL for end of string
  2893.      returns   a converted copy of the string
  2894.  
  2895. (string-capitalize <str> &key :start :end)                CAPITALIZE STRING
  2896.      <str>     the string
  2897.      :start    the starting offset
  2898.      :end      the ending offset + 1 or NIL for end of string
  2899.      returns   a  converted copy  of the  string with  each word  having an
  2900.                initial uppercase letter and following lowercase letters
  2901.  
  2902. (nstring-upcase <str> &key :start :end)                CONVERT TO UPPERCASE
  2903.      <str>     the string
  2904.      :start    the starting offset
  2905.      :end      the ending offset + 1 or NIL for end of string
  2906.      returns   the converted string (not a copy)
  2907.  
  2908.  
  2909.  
  2910.  
  2911. XLISP 2.1g                    STRING FUNCTIONS                      Page 56
  2912.  
  2913.  
  2914. (nstring-downcase <str> &key :start :end)              CONVERT TO LOWERCASE
  2915.      <str>     the string
  2916.      :start    the starting offset
  2917.      :end      the ending offset + 1 or NIL for end of string
  2918.      returns   the converted string (not a copy)
  2919.  
  2920. (nstring-capitalize <str> &key :start :end)               CAPITALIZE STRING
  2921.      <str>     the string
  2922.      :start    the starting offset
  2923.      :end      the ending offset + 1 or NIL for end of string
  2924.      returns   the string with each word having an initial uppercase letter
  2925.                and following lowercase letters (not a copy)
  2926.  
  2927. (strcat <expr>...)                                      CONCATENATE STRINGS
  2928.      Macro in init.lsp, to maintain compatibility with XLISP.
  2929.      See CONCATENATE for preferred function.
  2930.      <expr>    the strings to concatenate
  2931.      returns   the result of concatenating the strings
  2932.  
  2933. (string< <str1> <str2> &key :start1 :end1 :start2 :end2)
  2934. (string<= <str1> <str2> &key :start1 :end1 :start2 :end2)
  2935. (string= <str1> <str2> &key :start1 :end1 :start2 :end2)
  2936. (string/= <str1> <str2> &key :start1 :end1 :start2 :end2)
  2937. (string>= <str1> <str2> &key :start1 :end1 :start2 :end2)
  2938. (string> <str1> <str2> &key :start1 :end1 :start2 :end2)
  2939.      <str1>    the first string to compare
  2940.      <str2>    the second string to compare
  2941.      :start1   first substring starting offset
  2942.      :end1     first substring ending offset + 1 or NIL for end of string
  2943.      :start2   second substring starting offset
  2944.      :end2     second substring ending offset + 1 or NIL for end of string
  2945.      returns   string=: t if predicate is true, NIL otherwise
  2946.                others: If predicate is true then number of initial matching
  2947.                characters, else NIL
  2948.      Note: case is significant with these comparison functions.
  2949.  
  2950. (string-lessp <str1> <str2> &key :start1 :end1 :start2 :end2)
  2951. (string-not-greaterp <str1> <str2> &key :start1 :end1 :start2 :end2)
  2952. (string-equal <str1> <str2> &key :start1 :end1 :start2 :end2)
  2953. (string-not-equal <str1> <str2> &key :start1 :end1 :start2 :end2)
  2954. (string-not-lessp <str1> <str2> &key :start1 :end1 :start2 :end2)
  2955. (string-greaterp <str1> <str2> &key :start1 :end1 :start2 :end2)
  2956.      <str1>    the first string to compare
  2957.      <str2>    the second string to compare
  2958.      :start1   first substring starting offset
  2959.      :end1     first substring ending offset + 1 or NIL for end of string
  2960.      :start2   second substring starting offset
  2961.      :end2     second substring ending offset + 1 or NIL for end of string
  2962.      returns   string-equal: t if predicate is true, NIL otherwise
  2963.                others: If predicate is true then number of initial matching
  2964.                characters, else NIL
  2965.      Note: case is not  significant with these comparison functions  -- all
  2966.      uppercase characters are converted to lowercase before being compared.
  2967.  
  2968.  
  2969.  
  2970.  
  2971. XLISP 2.1g                  CHARACTER FUNCTIONS                     Page 57
  2972.  
  2973.  
  2974.  
  2975. CHARACTER FUNCTIONS
  2976.  
  2977. (char <string> <index>)                   EXTRACT A CHARACTER FROM A STRING
  2978.      <string>  the string
  2979.      <index>   the string index (zero relative)
  2980.      returns   the ascii code of the character
  2981.  
  2982. (alphanumericp <chr>)                       IS THIS CHARACTER ALPHANUMERIC?
  2983.      <chr>     the character
  2984.      returns   true  if  the  character   is  alphabetic  or  numeric,  NIL
  2985.                otherwise
  2986.  
  2987. (upper-case-p <chr>)                       IS THIS AN UPPER CASE CHARACTER?
  2988.      <chr>     the character
  2989.      returns   true if the character is upper case, NIL otherwise
  2990.  
  2991. (lower-case-p <chr>)                        IS THIS A LOWER CASE CHARACTER?
  2992.      <chr>     the character
  2993.      returns   true if the character is lower case, NIL otherwise
  2994.  
  2995. (alpha-char-p <chr>)                       IS THIS AN ALPHABETIC CHARACTER?
  2996.      <chr>     the character
  2997.      returns   true if the character is alphabetic, NIL otherwise
  2998.  
  2999. (both-case-p <chr>)          IS THIS AN ALPHABETIC (EITHER CASE) CHARACTER?
  3000.      <chr>     the character
  3001.      returns   true  if the  character  is  available  in both  cases,  NIL
  3002.                otherwise
  3003.  
  3004. (digit-char-p <chr>)                             IS THIS A DIGIT CHARACTER?
  3005.      <chr>     the character
  3006.      returns   the digit weight if character is a digit, NIL otherwise
  3007.  
  3008. (char-code <chr>)                         GET THE ASCII CODE OF A CHARACTER
  3009.      <chr>     the character
  3010.      returns   the ASCII character code (integer, parity bit stripped)
  3011.  
  3012. (code-char <code>)             GET THE CHARACTER WITH A SPECFIED ASCII CODE
  3013.      <code>    the ASCII code (integer, range 0-127)
  3014.      returns   the character with that code or NIL
  3015.  
  3016. (char-upcase <chr>)                       CONVERT A CHARACTER TO UPPER CASE
  3017.      <chr>     the character
  3018.      returns   the upper  case  version of  the character,  if one  exists,
  3019.                otherwise returns the character
  3020.  
  3021. (char-downcase <chr>)                     CONVERT A CHARACTER TO LOWER CASE
  3022.      <chr>     the character
  3023.      returns   the  lower case  version  of the  character, if  one exists,
  3024.                otherwise returns the character
  3025.  
  3026. (digit-char <n>)                          CONVERT A DIGIT WEIGHT TO A DIGIT
  3027.      <n>       the digit weight (integer)
  3028.      returns   the digit character or NIL
  3029.  
  3030.  
  3031.  
  3032.  
  3033. XLISP 2.1g                  CHARACTER FUNCTIONS                     Page 58
  3034.  
  3035.  
  3036. (char-int <chr>)                          CONVERT A CHARACTER TO AN INTEGER
  3037.      <chr>     the character
  3038.      returns   the ASCII character code (range 0-255)
  3039.  
  3040. (int-char <int>)                          CONVERT AN INTEGER TO A CHARACTER
  3041.      <int>     the ASCII character code (treated modulo 256)
  3042.      returns   the character with that code
  3043.  
  3044. (char< <chr1> <chr2>...)
  3045. (char<= <chr1> <chr2>...)
  3046. (char= <chr1> <chr2>...)
  3047. (char/= <chr1> <chr2>...)
  3048. (char>= <chr1> <chr2>...)
  3049. (char> <chr1> <chr2>...)
  3050.      <chr1>    the first character to compare
  3051.      <chr2>    the second character(s) to compare
  3052.      returns   t if predicate is true, NIL otherwise
  3053.      Note: case is significant with these comparison functions.
  3054.  
  3055. (char-lessp <chr1> <chr2>...)
  3056. (char-not-greaterp <chr1> <chr2>...)
  3057. (char-equal <chr1> <chr2>...)
  3058. (char-not-equal <chr1> <chr2>...)
  3059. (char-not-lessp <chr1> <chr2>...)
  3060. (char-greaterp <chr1> <chr2>...)
  3061.      <chr1>    the first string to compare
  3062.      <chr2>    the second string(s) to compare
  3063.      returns   t if predicate is true, NIL otherwise
  3064.      Note: case is not  significant with these comparison functions  -- all
  3065.      uppercase characters are converted to lowercase before the comparison.
  3066.  
  3067.  
  3068.  
  3069.  
  3070. XLISP 2.1g                  STRUCTURE FUNCTIONS                     Page 59
  3071.  
  3072.  
  3073.  
  3074. STRUCTURE FUNCTIONS
  3075.  
  3076. XLISP provides a subset  of the Common Lisp structure  definition facility.
  3077. No  slot options  are allowed,  but slots  can have  default initialization
  3078. expressions.
  3079.  
  3080.      (defstruct name [<comment>] <slot-desc>...)
  3081. or
  3082.      (defstruct (name <option>...) [<comment>] <slot-desc>...)
  3083.                fsubr
  3084.                <name>              the structure name symbol (quoted)
  3085.                <option>            option description (quoted)
  3086.                <comment>           comment string (ignored)
  3087.                <slot-desc>         slot descriptions (quoted)
  3088.                returns             the structure name
  3089.  
  3090. The recognized options are:
  3091.  
  3092.      (:conc-name name)
  3093.      (:include name [<slot-desc>...])
  3094.      (:print-function <function>)
  3095.  
  3096. Note that if :CONC-NAME appears, it should be before :INCLUDE.
  3097.  
  3098. Each slot description takes the form:
  3099.  
  3100.      <name>
  3101. or
  3102.      (<name> <defexpr>)
  3103.  
  3104. If the default initialization expression is not specified, the slot will be
  3105. initialized  to NIL  if  no keyword  argument  is  passed to  the  creation
  3106. function.
  3107.  
  3108. The  optional  :PRINT-FUNCTION  overrides  the  default  #S  notation.  The
  3109. function must take three arguments, the structure instance, the stream, and
  3110. the current printing depth.
  3111.  
  3112. DEFSTRUCT  causes access functions to be created  for each of the slots and
  3113. also arranges that SETF will work  with those access functions. The  access
  3114. function  names are constructed by  taking the structure  name, appending a
  3115. '-' and then appending  the slot name. This can be  overridden by using the
  3116. :CONC-NAME option.
  3117.  
  3118. DEFSTRUCT also  makes a creation function called  MAKE-<structname>, a copy
  3119. function  called  COPY-<structname>   and  a   predicate  function   called
  3120. <structname>-P. The creation  function takes keyword arguments  for each of
  3121. the slots. Structures can be created using the #S( read macro, as well.
  3122.  
  3123. The  property  *struct-slots*  is  added  to  the  symbol  that  names  the
  3124. structure. This property  consists of an association list of slot names and
  3125. closures  that evaluate  to the  initial values  (NIL if  no initial  value
  3126. expression).
  3127.  
  3128.  
  3129.  
  3130.  
  3131. XLISP 2.1g                  STRUCTURE FUNCTIONS                     Page 60
  3132.  
  3133.  
  3134. For instance:
  3135.  
  3136.      (defstruct foo bar (gag 2))
  3137.  
  3138. creates the following functions:
  3139.  
  3140.      (foo-bar <expr>)
  3141.      (setf (foo-bar <expr>) <value>)
  3142.      (foo-gag <expr>)
  3143.      (setf (foo-gag <expr>) <value>)
  3144.      (make-foo &key :bar :gag)
  3145.      (copy-foo <expr>)
  3146.      (foo-p <expr>)
  3147.  
  3148.  
  3149.  
  3150.  
  3151. XLISP 2.1g                    OBJECT FUNCTIONS                      Page 61
  3152.  
  3153.  
  3154.  
  3155. OBJECT FUNCTIONS
  3156.  
  3157. Note  that the  functions  provided  in  classes.lsp  are  useful  but  not
  3158. necessary.
  3159.  
  3160. Messages defined for Object and Class are listed starting on page 20.
  3161.  
  3162. (send <object> <message> [<args>...])                        SEND A MESSAGE
  3163.      <object>  the object to receive the message
  3164.      <message> message sent to object
  3165.      <args>    arguments to method (if any)
  3166.      returns   the result of the method
  3167.  
  3168. (send-super <message> [<args>])                SEND A MESSAGE TO SUPERCLASS
  3169.      valid only in method context
  3170.      <message> message sent to method's superclass
  3171.      <args>    arguments to method (if any)
  3172.      returns   the result of the method
  3173.  
  3174. (defclass <sym> <ivars> [<cvars> [<super>]])             DEFINE A NEW CLASS
  3175.      defined in class.lsp as a macro
  3176.      <sym>     symbol  whose value  is  to be  bound  to the  class  object
  3177.                (quoted)
  3178.      <ivars>   list  of instance  variables  (quoted).  Instance  variables
  3179.                specified  either as  <ivar> or  (<ivar> <init>)  to specify
  3180.                non-NIL default initial value.
  3181.      <cvars>   list of class variables (quoted)
  3182.      <super>   superclass, or Object if absent.
  3183.      This function  sends :SET-PNAME  (defined in  classes.lsp) to  the new
  3184.      class to set the class' print name instance variable.
  3185.      Methods defined for classes defined with defclass:
  3186.      (send <object> :<ivar>)
  3187.                Returns the specified instance variable
  3188.      (send <object> :SET-IVAR <ivar> <value>)
  3189.                Used to set an instance variable, typically with setf.
  3190.      (send <sym> :NEW {:<ivar> <init>})
  3191.                Actually   definition  for   :ISNEW.   Creates  new   object
  3192.                initializing  instance  variables  as  specified  in keyword
  3193.                arguments,  or  to  their  default if  keyword  argument  is
  3194.                missing. Returns the object.
  3195.  
  3196. (defmethod <class> <sym> <fargs> <expr> ...)            DEFINE A NEW METHOD
  3197.      defined in class.lsp as a macro
  3198.      <class>   Class which will respond to message
  3199.      <sym>     Message name (quoted)
  3200.      <fargs>   Formal argument list. Leading "self" is implied (quoted)
  3201.      <expr>    Expressions constituting body of method (quoted)
  3202.      returns   the class object.
  3203.  
  3204.  
  3205.  
  3206.  
  3207. XLISP 2.1g                    OBJECT FUNCTIONS                      Page 62
  3208.  
  3209.  
  3210. (definst <class> <sym> [<args>...])            DEFINE A NEW GLOBAL INSTANCE
  3211.      defined in class.lsp as a macro
  3212.      <class>   Class of new object
  3213.      <sym>     Symbol whose value will be set to new object
  3214.      <args>    Arguments  passed  to  :NEW  (typically initial  values  for
  3215.                instance variables)
  3216.  
  3217.  
  3218.  
  3219.  
  3220. XLISP 2.1g                  PREDICATE FUNCTIONS                     Page 63
  3221.  
  3222.  
  3223.  
  3224. PREDICATE FUNCTIONS
  3225.  
  3226. (atom <expr>)                                              IS THIS AN ATOM?
  3227.      <expr>    the expression to check
  3228.      returns   t if the value is an atom, NIL otherwise
  3229.  
  3230. (symbolp <expr>)                                          IS THIS A SYMBOL?
  3231.      <expr>    the expression to check
  3232.      returns   t if the expression is a symbol, NIL otherwise
  3233.  
  3234. (numberp <expr>)                                          IS THIS A NUMBER?
  3235.      <expr>    the expression to check
  3236.      returns   t if the expression is a number, NIL otherwise
  3237.  
  3238. (null <expr>)                                        IS THIS AN EMPTY LIST?
  3239.      <expr>    the list to check
  3240.      returns   t if the list is empty, NIL otherwise
  3241.  
  3242. (not <expr>)                                                 IS THIS FALSE?
  3243.      <expr>    the expression to check
  3244.      return    t if the value is NIL, NIL otherwise
  3245.  
  3246. (listp <expr>)                                              IS THIS A LIST?
  3247.      <expr>    the expression to check
  3248.      returns   t if the value is a cons or NIL, NIL otherwise
  3249.  
  3250. (endp <list>)                                    IS THIS THE END OF A LIST?
  3251.      <list>    the list
  3252.      returns   t if the value is NIL, NIL otherwise
  3253.  
  3254. (consp <expr>)                                    IS THIS A NON-EMPTY LIST?
  3255.      <expr>    the expression to check
  3256.      returns   t if the value is a cons, NIL otherwise
  3257.  
  3258. (constantp <expr>)                                      IS THIS A CONSTANT?
  3259.      <expr>    the expression to check
  3260.      returns   t if the value  is a constant (basically, would  EVAL <expr>
  3261.                repeatedly return the same thing?), NIL otherwise.
  3262.  
  3263. (specialp <expr>)                                 IS THIS A SPECIAL SYMBOL?
  3264.      <expr>    the expression to check
  3265.      returns   t if the value is a symbol which is SPECIAL, NIL otherwise.
  3266.  
  3267. (integerp <expr>)                                       IS THIS AN INTEGER?
  3268.      <expr>    the expression to check
  3269.      returns   t if the value is an integer, NIL otherwise
  3270.  
  3271. (floatp <expr>)                                            IS THIS A FLOAT?
  3272.      <expr>    the expression to check
  3273.      returns   t if the value is a float, NIL otherwise
  3274.  
  3275.  
  3276.  
  3277.  
  3278. XLISP 2.1g                  PREDICATE FUNCTIONS                     Page 64
  3279.  
  3280.  
  3281. (rationalp <expr>)                               IS THIS A RATIONAL NUMBER?
  3282.      Part of math extension.
  3283.      <expr>    the expression to check
  3284.      returns   t if the value is rational (integer or ratio), NIL otherwise
  3285.  
  3286. (complexp <expr>)                                 IS THIS A COMPLEX NUMBER?
  3287.      Part of math extension.
  3288.      <expr>    the expression to check
  3289.      returns   t if the value is a complex number, NIL otherwise
  3290.  
  3291. (stringp <expr>)                                          IS THIS A STRING?
  3292.      <expr>    the expression to check
  3293.      returns   t if the value is a string, NIL otherwise
  3294.  
  3295. (characterp <expr>)                                    IS THIS A CHARACTER?
  3296.      <expr>    the expression to check
  3297.      returns   t if the value is a character, NIL otherwise
  3298.  
  3299. (arrayp <expr>)                                           IS THIS AN ARRAY?
  3300.      <expr>    the expression to check
  3301.      returns   t if the value is an array, NIL otherwise
  3302.  
  3303. (streamp <expr>)                                          IS THIS A STREAM?
  3304.      <expr>    the expression to check
  3305.      returns   t if the value is a stream, NIL otherwise
  3306.  
  3307. (open-stream-p <stream>)                                    IS STREAM OPEN?
  3308.      <stream>  the stream
  3309.      returns   t if the stream is open, NIL otherwise
  3310.  
  3311. (input-stream-p <stream>)                               IS STREAM READABLE?
  3312.      <stream>  the stream
  3313.      returns   t if stream is readable, NIL otherwise
  3314.  
  3315. (output-stream-p <stream>)                              IS STREAM WRITABLE?
  3316.      <stream>  the stream
  3317.      returns   t if stream is writable, NIL otherwise
  3318.  
  3319. (objectp <expr>)                                         IS THIS AN OBJECT?
  3320.      <expr>    the expression to check
  3321.      returns   t if the value is an object, NIL otherwise
  3322.  
  3323. (classp <expr>)                                     IS THIS A CLASS OBJECT?
  3324.      <expr>    the expression to check
  3325.      returns   t if the value is a class object, NIL otherwise
  3326.  
  3327. (boundp <sym>)                             IS A VALUE BOUND TO THIS SYMBOL?
  3328.      <sym>     the symbol
  3329.      returns   t if a value is bound to the symbol, NIL otherwise
  3330.  
  3331. (fboundp <sym>)                 IS A FUNCTIONAL VALUE BOUND TO THIS SYMBOL?
  3332.      <sym>     the symbol
  3333.      returns   t  if a  functional  value  is  bound  to  the  symbol,  NIL
  3334.                otherwise
  3335.  
  3336.  
  3337.  
  3338.  
  3339. XLISP 2.1g                  PREDICATE FUNCTIONS                     Page 65
  3340.  
  3341.  
  3342. (functionp <sym>)                                       IS THIS A FUNCTION?
  3343.      Defined in common.lsp
  3344.      <expr>    the expression to check
  3345.      returns   t if the value  is a function -- that is,  can it be applied
  3346.                to arguments. This is  true for any symbol (even  those with
  3347.                no function binding), list with car being lambda, a closure,
  3348.                or subr. Otherwise returns NIL.
  3349.  
  3350. (minusp <expr>)                                    IS THIS NUMBER NEGATIVE?
  3351.      <expr>    the number to test
  3352.      returns   t if the number is negative, NIL otherwise
  3353.  
  3354. (zerop <expr>)                                         IS THIS NUMBER ZERO?
  3355.      <expr>    the number to test
  3356.      returns   t if the number is zero, NIL otherwise
  3357.  
  3358. (plusp <expr>)                                     IS THIS NUMBER POSITIVE?
  3359.      <expr>    the number to test
  3360.      returns   t if the number is positive, NIL otherwise
  3361.  
  3362. (evenp <expr>)                                        IS THIS INTEGER EVEN?
  3363.      <expr>    the integer to test
  3364.      returns   t if the integer is even, NIL otherwise
  3365.  
  3366. (oddp <expr>)                                          IS THIS INTEGER ODD?
  3367.      <expr>    the integer to test
  3368.      returns   t if the integer is odd, NIL otherwise
  3369.  
  3370. (subsetp <list1> <list2> &key :test :test-not :key)        IS SET A SUBSET?
  3371.      <list1>   the first list
  3372.      <list2>   the second list
  3373.      :test     test function (defaults to eql)
  3374.      :test-not test function (sense inverted)
  3375.      :key      function to  apply to  test function arguments  (defaults to
  3376.                identity)
  3377.      returns   t if  every element of the first list is in the second list,
  3378.                NIL otherwise
  3379.  
  3380. (eq <expr1> <expr2>)                             ARE THE EXPRESSIONS EQUAL?
  3381. (eql <expr1> <expr2>)
  3382. (equal <expr1> <expr2>)
  3383. (equalp <expr1> <expr2>)
  3384.      equalp defined in common.lsp
  3385.      <expr1>   the first expression
  3386.      <expr2>   the second expression
  3387.      returns   t  if  equal,  NIL  otherwise. Each  is  progressively  more
  3388.                liberal in what is "equal":
  3389.                eq: identical  pointers --  works with characters,  symbols,
  3390.                          and arbitrarily small integers
  3391.                eql: works with  all numbers, if  same type (see  also =  on
  3392.                page 53)
  3393.                equal: lists and strings
  3394.                equalp: case  insensitive characters (and  strings), numbers
  3395.                          of differing types, arrays (which can be equalp to
  3396.                          string containing same elements)
  3397.  
  3398.  
  3399.  
  3400.  
  3401. XLISP 2.1g                  PREDICATE FUNCTIONS                     Page 66
  3402.  
  3403.  
  3404. (typep <expr> <type>)                             IS THIS A SPECIFIED TYPE?
  3405.      <expr>    the expression to test
  3406.      <type>    the  type specifier.  Symbols  can either  be  one of  those
  3407.                listed under type-of (on page 87) or one of:
  3408.                ATOM      any atom
  3409.                NULL      NIL
  3410.                LIST      matches NIL or any cons cell
  3411.                STREAM    any stream
  3412.                NUMBER    any number type
  3413.                RATIONAL  fixnum or ratio (math extension)
  3414.                STRUCT    any structure (except hash-table)
  3415.                FUNCTION  any function, as defined by functionp (page 65)
  3416.                The specifer can also be  a form (which can be  nested). All
  3417.                form elements are quoted. Valid form cars:
  3418.                or        any of the cdr type specifiers must be true
  3419.                and       all of the cdr type specifiers must be true
  3420.                not       the single cdr type specifier must be false
  3421.                satisfies the  result of applying the cdr predicate function
  3422.                          to <expr>
  3423.                member    <expr> must be eql to one of the cdr values
  3424.                object    <expr> must  be an  object, of class  specified by
  3425.                          the  single  cdr value.  The  cdr value  can  be a
  3426.                          symbol which must evaluate to a class.
  3427.                Note that  everything is of type  T, and nothing  is of type
  3428.                NIL.
  3429.      returns   t if <expr> is of type <type>, NIL otherwise.
  3430.  
  3431.  
  3432.  
  3433.  
  3434. XLISP 2.1g                   CONTROL CONSTRUCTS                     Page 67
  3435.  
  3436.  
  3437.  
  3438. CONTROL CONSTRUCTS
  3439.  
  3440. (cond <pair>...)                                     EVALUATE CONDITIONALLY
  3441.      fsubr
  3442.      <pair>    pair consisting of:
  3443.                (<pred> <expr>...)
  3444.                where
  3445.                <pred>    is a predicate expression
  3446.                <expr>    evaluated if the predicate is not NIL
  3447.      returns   the value of the first expression whose predicate is not NIL
  3448.  
  3449. (and <expr>...)                    THE LOGICAL AND OF A LIST OF EXPRESSIONS
  3450.      fsubr
  3451.      <expr>    the expressions to be ANDed
  3452.      returns   NIL if any  expression evaluates to NIL, otherwise the value
  3453.                of  the last  expression  (evaluation  of expressions  stops
  3454.                after the first expression that evaluates to NIL)
  3455.  
  3456. (or <expr>...)                      THE LOGICAL OR OF A LIST OF EXPRESSIONS
  3457.      fsubr
  3458.      <expr>    the expressions to be ORed
  3459.      returns   NIL if all expressions evaluate to NIL, otherwise  the value
  3460.                of the  first non-NIL expression (evaluation  of expressions
  3461.                stops  after the first expression  that does not evaluate to
  3462.                NIL)
  3463.  
  3464. (if <texpr> <expr1> [<expr2>])           EVALUATE EXPRESSIONS CONDITIONALLY
  3465.      fsubr
  3466.      <texpr>   the test expression
  3467.      <expr1>   the expression to be evaluated if texpr is non-NIL
  3468.      <expr2>   the expression to be evaluated if texpr is NIL
  3469.      returns   the value of the selected expression
  3470.  
  3471. (when <texpr> <expr>...)             EVALUATE ONLY WHEN A CONDITION IS TRUE
  3472.      fsubr
  3473.      <texpr>   the test expression
  3474.      <expr>    the expression(s) to be evaluted if texpr is non-NIL
  3475.      returns   the value of the last expression or NIL
  3476.  
  3477. (unless <texpr> <expr>...)          EVALUATE ONLY WHEN A CONDITION IS FALSE
  3478.      fsubr
  3479.      <texpr>   the test expression
  3480.      <expr>    the expression(s) to be evaluated if texpr is NIL
  3481.      returns   the value of the last expression or NIL
  3482.  
  3483.  
  3484.  
  3485.  
  3486. XLISP 2.1g                   CONTROL CONSTRUCTS                     Page 68
  3487.  
  3488.  
  3489. (case <expr> <case>...[(t <expr>)])                          SELECT BY CASE
  3490.      fsubr
  3491.      <expr>    the selection expression
  3492.      <case>    pair consisting of:
  3493.                (<value> <expr>...)
  3494.                where:
  3495.                <value>   is a  single expression  or a list  of expressions
  3496.                          (unevaluated)
  3497.                <expr>    are expressions to execute if the case matches
  3498.      (t <expr>)          default case (no previous matching)
  3499.      returns   the value of the last expression of the matching case
  3500.  
  3501. (let (<binding>...) <expr>...)                        CREATE LOCAL BINDINGS
  3502. (let* (<binding>...) <expr>...)                 LET WITH SEQUENTIAL BINDING
  3503.      fsubr
  3504.      <binding> the variable bindings each of which is either:
  3505.                1)        a symbol (which is initialized to NIL)
  3506.                2)        a  list whose car is a symbol and whose cadr is an
  3507.                          initialization expression
  3508.      <expr>    the expressions to be evaluated
  3509.      returns   the value of the last expression
  3510.  
  3511. (flet (<binding>...) <expr>...)                      CREATE LOCAL FUNCTIONS
  3512. (labels (<binding>...) <expr>...)             FLET WITH RECURSIVE FUNCTIONS
  3513. (macrolet (<binding>...) <expr>...)                     CREATE LOCAL MACROS
  3514.      fsubr
  3515.      <binding> the function bindings each of which is:
  3516.                (<sym> <fargs> <expr>...)
  3517.                where:
  3518.                <sym>     the function/macro name
  3519.                <fargs>   formal argument list (lambda list)
  3520.                <expr>    expressions   constituting   the   body   of   the
  3521.                          function/macro
  3522.      <expr>    the expressions to be evaluated
  3523.      returns   the value of the last expression
  3524.  
  3525. (catch <sym> <expr>...)               EVALUATE EXPRESSIONS AND CATCH THROWS
  3526.      fsubr
  3527.      <sym>     the catch tag
  3528.      <expr>    expressions to evaluate
  3529.      returns   the value of the last expression or the throw expression
  3530.  
  3531. (throw <sym> [<expr>])                                     THROW TO A CATCH
  3532.      fsubr
  3533.      <sym>     the catch tag
  3534.      <expr>    the value for the catch to return (defaults to NIL)
  3535.      returns   never returns
  3536.  
  3537.  
  3538.  
  3539.  
  3540. XLISP 2.1g                   CONTROL CONSTRUCTS                     Page 69
  3541.  
  3542.  
  3543. (unwind-protect <expr> <cexpr>...)      PROTECT EVALUATION OF AN EXPRESSION
  3544.      fsubr
  3545.      <expr>    the expression to protect
  3546.      <cexpr>   the cleanup expressions
  3547.      returns   the value of the expression
  3548.      Note:   unwind-protect guarantees  to execute the  cleanup expressions
  3549.      even  if a non-local exit  terminates the evaluation  of the protected
  3550.      expression
  3551.  
  3552.  
  3553.  
  3554.  
  3555. XLISP 2.1g                   LOOPING CONSTRUCTS                     Page 70
  3556.  
  3557.  
  3558.  
  3559. LOOPING CONSTRUCTS
  3560.  
  3561. (loop <expr>...)                                         BASIC LOOPING FORM
  3562.      fsubr
  3563.      <expr>    the body of the loop
  3564.      returns   never returns (must use non-local exit, such as RETURN)
  3565.  
  3566. (do (<binding>...) (<texpr> <rexpr>...) <expr>...)     GENERAL LOOPING FORM
  3567. (do* (<binding>...) (<texpr> <rexpr>...) <expr>...)
  3568.      fsubr. do binds simultaneously, do* binds sequentially
  3569.      <binding> the variable bindings each of which is either:
  3570.                1)        a symbol (which is initialized to NIL)
  3571.                2)        a list of the form: (<sym> <init> [<step>])
  3572.                where:
  3573.                          <sym>     is the symbol to bind
  3574.                          <init>    the initial value of the symbol
  3575.                          <step>    a step expression
  3576.      <texpr>   the termination test expression
  3577.      <rexpr>   result expressions (the default is NIL)
  3578.      <expr>    the body of the loop (treated like an implicit prog)
  3579.      returns   the value of the last result expression
  3580.  
  3581. (dolist (<sym> <expr> [<rexpr>]) <expr>...)             LOOP THROUGH A LIST
  3582.      fsubr
  3583.      <sym>     the symbol to bind to each list element
  3584.      <expr>    the list expression
  3585.      <rexpr>   the result expression (the default is NIL)
  3586.      <expr>    the body of the loop (treated like an implicit prog)
  3587.      returns   the result expression
  3588.  
  3589. (dotimes (<sym> <expr> [<rexpr>]) <expr>...)          LOOP FROM ZERO TO N-1
  3590.      fsubr
  3591.      <sym>     the symbol to bind to each value from 0 to n-1
  3592.      <expr>    the number of times to loop
  3593.      <rexpr>   the result expression (the default is NIL)
  3594.      <expr>    the body of the loop (treated like an implicit prog)
  3595.      returns   the result expression
  3596.  
  3597.  
  3598.  
  3599.  
  3600. XLISP 2.1g                  THE PROGRAM FEATURE                     Page 71
  3601.  
  3602.  
  3603.  
  3604. THE PROGRAM FEATURE
  3605.  
  3606. (prog (<binding>...) <expr>...)                         THE PROGRAM FEATURE
  3607. (prog* (<binding>...) <expr>...)               PROG WITH SEQUENTIAL BINDING
  3608.      fsubr -- equivalent to (let () (block NIL (tagbody ...)))
  3609.      <binding> the variable bindings each of which is either:
  3610.                1)        a symbol (which is initialized to NIL)
  3611.                2)        a list whose car is a  symbol and whose cadr is an
  3612.                          initialization expression
  3613.      <expr>    expressions to evaluate or tags (symbols)
  3614.      returns   NIL or the argument passed to the return function
  3615.  
  3616. (block <name> <expr>...)                                        NAMED BLOCK
  3617.      fsubr
  3618.      <name>    the block name (quoted symbol)
  3619.      <expr>    the block body
  3620.      returns   the value of the last expression
  3621.  
  3622. (return [<expr>])                  CAUSE A PROG CONSTRUCT TO RETURN A VALUE
  3623.      fsubr
  3624.      <expr>    the value (defaults to NIL)
  3625.      returns   never returns
  3626.  
  3627. (return-from <name> [<value>])        RETURN FROM A NAMED BLOCK OR FUNCTION
  3628.      fsubr.  In traditional  Xlisp,  the names  are  dynamically scoped.  A
  3629.      compilation option (default) uses lexical scoping like Common Lisp.
  3630.      <name>    the  block or function name (quoted symbol). If name is NIL,
  3631.                use function RETURN.
  3632.      <value>   the value to return (defaults to NIL)
  3633.      returns   never returns
  3634.  
  3635. (tagbody <expr>...)                                       BLOCK WITH LABELS
  3636.      fsubr
  3637.      <expr>    expression(s) to evaluate or tags (symbols)
  3638.      returns   NIL
  3639.  
  3640. (go <sym>)                                     GO TO A TAG WITHIN A TAGBODY
  3641.      fsubr.  In   traditional  Xlisp,   tags  are  dynamically   scoped.  A
  3642.      compilation option (default) uses lexical scoping like Common Lisp.
  3643.      <sym>     the tag (quoted)
  3644.      returns   never returns
  3645.  
  3646. (progv <slist> <vlist> <expr>...)                  DYNAMICALLY BIND SYMBOLS
  3647.      fsubr
  3648.      <slist>   list of symbols (evaluated)
  3649.      <vlist>   list of values to bind to the symbols (evaluated)
  3650.      <expr>    expression(s) to evaluate
  3651.      returns   the value of the last expression
  3652.  
  3653. (prog1 <expr1> <expr>...)                  EXECUTE EXPRESSIONS SEQUENTIALLY
  3654.      fsubr
  3655.      <expr1>   the first expression to evaluate
  3656.      <expr>    the remaining expressions to evaluate
  3657.      returns   the value of the first expression
  3658.  
  3659.  
  3660.  
  3661.  
  3662. XLISP 2.1g                  THE PROGRAM FEATURE                     Page 72
  3663.  
  3664.  
  3665. (prog2 <expr1> <expr2> <expr>...)          EXECUTE EXPRESSIONS SEQUENTIALLY
  3666.      fsubr
  3667.      <expr1>   the first expression to evaluate
  3668.      <expr2>   the second expression to evaluate
  3669.      <expr>    the remaining expressions to evaluate
  3670.      returns   the value of the second expression
  3671.  
  3672. (progn <expr>...)                          EXECUTE EXPRESSIONS SEQUENTIALLY
  3673.      fsubr
  3674.      <expr>    the expressions to evaluate
  3675.      returns   the value of the last expression (or NIL)
  3676.  
  3677.  
  3678.  
  3679.  
  3680. XLISP 2.1g                 INPUT/OUTPUT FUNCTIONS                   Page 73
  3681.  
  3682.  
  3683.  
  3684. INPUT/OUTPUT FUNCTIONS
  3685.  
  3686. Note  that when printing objects,  printing is accomplished  by sending the
  3687. message :prin1 to the object.
  3688.  
  3689. (read [<stream> [<eofp> [<eof> [<rflag>]]]])             READ AN EXPRESSION
  3690.      NOTE:  there has been an  incompatible change in  arguments from prior
  3691.      versions.
  3692.      <stream>  the input stream (default, or NIL, is *standard-input*, T is
  3693.                *terminal-io*)
  3694.      <eofp>    When T,  signal an  error on end  of file,  when NIL  return
  3695.                <eof> (default is T)
  3696.      <eof>     the value to return on end of file (default is NIL)
  3697.      <rflag>   recursive read flag. The value is ignored
  3698.      returns   the expression read
  3699.  
  3700. (set-macro-character <ch> <fcn> [ T ])                    MODIFY READ TABLE
  3701.      defined in init.lsp
  3702.      <ch>      character to define
  3703.      <fcn>     function to bind to character (see page 12)
  3704.      T         if TMACRO rather than NMACRO
  3705.  
  3706. (get-macro-character <ch>)                               EXAMINE READ TABLE
  3707.      defined in init.lsp
  3708.      <ch>      character
  3709.      returns   function bound to character
  3710.  
  3711. (print <expr> [<stream>])                 PRINT AN EXPRESSION ON A NEW LINE
  3712.      The expression is printed using prin1, then current line is terminated
  3713.      (Note: this is backwards from Common Lisp).
  3714.      <expr>    the expression to be printed
  3715.      <stream>  the output stream (default,  or NIL, is *standard-output*, T
  3716.                is *terminal-io*)
  3717.      returns   the expression
  3718.  
  3719. (prin1 <expr> [<stream>])                               PRINT AN EXPRESSION
  3720.      symbols, cons cells (without circularities), arrays, strings, numbers,
  3721.      and characters are  printed in  a format generally  acceptable to  the
  3722.      read  function.  Printing  format  can  be   affected  by  the  global
  3723.      formatting variables: *print-level* and  *print-length* for lists  and
  3724.      arrays,  *integer-format*  for  fixnums,  *float-format*  for flonums,
  3725.      *ratio-format* for  ratios, and *print-case* and  *readtable-case* for
  3726.      symbols.
  3727.      <expr>    the expression to be printed
  3728.      <stream>  the output stream (default,  or NIL, is *standard-output*, T
  3729.                is *terminal-io*)
  3730.      returns   the expression
  3731.  
  3732.  
  3733.  
  3734.  
  3735. XLISP 2.1g                 INPUT/OUTPUT FUNCTIONS                   Page 74
  3736.  
  3737.  
  3738. (princ <expr> [<stream>])               PRINT AN EXPRESSION WITHOUT QUOTING
  3739.      Like  PRIN1  except  symbols  (including  uninterned),  strings,   and
  3740.      characters are printed without using any quoting mechanisms.
  3741.      <expr>    the expressions to be printed
  3742.      <stream>  the output stream (default,  or NIL, is *standard-output*, T
  3743.                is *terminal-io*)
  3744.      returns   the expression
  3745.  
  3746. (pprint <expr> [<stream>])                       PRETTY PRINT AN EXPRESSION
  3747.      Uses prin1 for printing.
  3748.      <expr>    the expressions to be printed
  3749.      <stream>  the output stream (default,  or NIL, is *standard-output*, T
  3750.                is *terminal-io*)
  3751.      returns   the expression
  3752.  
  3753. (terpri [<stream>])                        TERMINATE THE CURRENT PRINT LINE
  3754.      <stream>  the output stream (default,  or NIL, is *standard-output*, T
  3755.                is *terminal-io*)
  3756.      returns   NIL
  3757.  
  3758. (fresh-line [<stream>])                                    START A NEW LINE
  3759.      <stream>  the output stream (default,  or NIL, is *standard-output*, T
  3760.                is *terminal-io*)
  3761.      returns   t if  a new list was started, NIL if already at the start of
  3762.                a line.
  3763.  
  3764. (flatsize <expr>)              LENGTH OF PRINTED REPRESENTATION USING PRIN1
  3765.      <expr>    the expression
  3766.      returns   the length
  3767.  
  3768. (flatc <expr>)                 LENGTH OF PRINTED REPRESENTATION USING PRINC
  3769.      <expr>    the expression
  3770.      returns   the length
  3771.  
  3772. (y-or-n-p [<fmt> [<arg>...]])                      ASK A YES OR NO QUESTION
  3773. (yes-or-no-p [<fmt> [<arg>...]])
  3774.      defined  in common.lsp.  Uses  *terminal-io* stream  for  interaction.
  3775.      y-or-n-p  strives for  a  single character  answer,  using get-key  if
  3776.      defined.
  3777.      <fmt>     optional format string for question (see page 75)
  3778.      <arg>     arguments, if any, for format string
  3779.      returns   T for yes, NIL for no.
  3780.  
  3781.  
  3782.  
  3783.  
  3784. XLISP 2.1g                  THE FORMAT FUNCTION                     Page 75
  3785.  
  3786.  
  3787.  
  3788. THE FORMAT FUNCTION
  3789.  
  3790. (format <stream> <fmt> [<arg>...])                      DO FORMATTED OUTPUT
  3791.      <stream>  the output stream (T is *standard-output*)
  3792.      <fmt>     the format string
  3793.      <arg>     the format arguments
  3794.      returns   output string if <stream> is NIL, NIL otherwise
  3795.  
  3796. The format string can contain characters that  should be copied directly to
  3797. the output and formatting directives. The formatting directives are:
  3798.  
  3799.      ~A or ~a  print next argument using princ
  3800.      ~S or ~s  print next argument using prin1
  3801.      ~D or ~d  print next argument as decimal integer
  3802.      ~E or ~e  print next argument in exponential form
  3803.      ~F or ~f  print next argument in fixed point form
  3804.      ~G or ~g  print next  argument  using either  ~E  or ~F  depending  on
  3805.      magnitude
  3806.      ~O or ~o  print next argument as octal integer
  3807.      ~X or ~x  print next argument as hexidecimal integer
  3808.      ~%        start a new line
  3809.      ~&        start a new line if not on a new line
  3810.      ~|        start a new page
  3811.      ~?        use next argument as recursive format string
  3812.      ~( ~)     process format string with case conversion
  3813.      ~{ ~}     process format string repetitively
  3814.      ~[ ~; ~]  process format string conditionally
  3815.      ~*        skip arguments
  3816.      ~t or ~T  go to a specified column
  3817.      ~~        print a tilde character
  3818.      ~\n       ignore return and following whitespace
  3819.  
  3820. The format directives can contain optional prefix and optional colon (:) or
  3821. at-sign (@)  modifiers between  the tilde  and directive  character. Prefix
  3822. characters  are unsigned integers,  the character '#'  which represents the
  3823. remaining number of arguments, the character  'v' to indicate the number is
  3824. taken from the  next argument, or a  single quote (') followed  by a single
  3825. character for those parameters that should be a single character.
  3826.  
  3827. For ~A and ~S the full form is:
  3828.  
  3829.      ~mincol,colinc,minpad,padchar:@A        (or S)
  3830.  
  3831. If :  is given, NIL  will print  as "()" rather  than "NIL". The  string is
  3832. padded on the right (or left, if @ is given) with  at least "minpad" copies
  3833. of the  "padchar". Padding characters are then inserted "colinc" characters
  3834. at  a time until the  total width is at least  "mincol". The defaults are 0
  3835. for mincol and minpad, 1 for colinc, and #\space for padchar. For example:
  3836.  
  3837.      ~15,,2,'.@A
  3838.  
  3839. The  output is padded on the left with  at least 2 periods until the output
  3840. is at least 15 characters wide.
  3841.  
  3842.  
  3843.  
  3844.  
  3845. XLISP 2.1g                  THE FORMAT FUNCTION                     Page 76
  3846.  
  3847.  
  3848. For ~D, ~O, and ~X the full form is ("D" shown):
  3849.  
  3850.      ~mincol,padchar@D
  3851.  
  3852. If the argument  is not a  FIXNUM, then the  format "~mincolA" is used.  If
  3853. "mincol" is specified then the  number is padded on the left to be at least
  3854. that  many characters long using  "padchar". "padchar" defaults to #\space.
  3855. If @ is used and the value is positive, then a leading plus sign is printed
  3856. before the first digit.
  3857.  
  3858. For ~E ~F and ~G the full form is:
  3859.  
  3860.      ~mincol,round,padchar@E                 (or F or G)
  3861.  
  3862. (This implementation is not Common Lisp compatible.) If the argument is not
  3863. a   real   number   (FIXNUM,   RATIO,   or   FLONUM),   then   the   format
  3864. "~mincol,padcharD" is  used. The number is printed  using the C language e,
  3865. f, or g formats. If the number could potentially take more  than 100 digits
  3866. to print, then  F format is forced  to E format, although some  C libraries
  3867. will do this  at a lower  number of digits. If  "round" is specified,  than
  3868. that is the number of digits to the right of the decimal point that will be
  3869. printed, otherwise  six digits (or  whatever is necessary in  G format) are
  3870. printed.  In G format, trailing zeroes are deleted and exponential notation
  3871. is used if the exponent of the number is greater than the precision or less
  3872. than  -4. If the @ modifier is used,  a leading plus sign is printed before
  3873. positive values. If "mincol" is specified, the number is padded on the left
  3874. to be at least "mincol" characters long using "padchar". "padchar" defaults
  3875. to #\space.
  3876.  
  3877. For  ~%, ~|,  and  ~~, the  full  form  is ~n%,  ~n|,  or ~n~.  "n"  copies
  3878. (default=1) of the character are output.
  3879.  
  3880. For ~&, the full form  is ~n&. ~0& does nothing. Otherwise  enough new line
  3881. characters are emited to move down to the "n"th new line (default=1).
  3882.  
  3883. For ~?,  the next argument  is taken  as a format  string, upon  completion
  3884. execution resumes in the current format string. The argument after is taken
  3885. as  the list  of arguments  used for  the new  format string  unless the  @
  3886. modifier is used, in which case the current argument list is used.
  3887.  
  3888. For ~(, the full form  is ~(string~). The string  is processed as a  format
  3889. string, however case conversion is performed on the output. If no modifiers
  3890. are used,  the string is converted  to lowercase. If the  colon modifier is
  3891. used alone then all words are capitalized. If the @ modifier  is used alone
  3892. then the  first character is converted  to upper case and  all remaining to
  3893. lowercase.  If both  modifiers are  used, all  characters are  converted to
  3894. uppercase.
  3895.  
  3896. For  ~{, the full  form is  ~n{string~}. Repeatedly  processes string  as a
  3897. format string,  or if the string is zero length, takes the next argument as
  3898. the string.  Iteration stops  when processing  has  occured n  times or  no
  3899. arguments remain. If the colon modifier is used on the ~} command, and n is
  3900. non-zero then the  string will be processed at least  once. If no modifiers
  3901. are used on ~{, then the  arguments are taken from the next  argument (like
  3902. in ~?). If  the colon modifier  is used, the  arguments are taken  from the
  3903.  
  3904.  
  3905.  
  3906.  
  3907. XLISP 2.1g                  THE FORMAT FUNCTION                     Page 77
  3908.  
  3909.  
  3910. next argument which must be a list of sublists -- the sublists are  used in
  3911. turn to provide arguments on each iteration. In either case, the @ modifier
  3912. will  cause the current arguement list to be used rather than a single list
  3913. argument.
  3914.  
  3915. For    ~[,    there   are    three    formats.    The    first   form    is
  3916. ~n[clause0~;clause1...~;clausen~].   Only  one   clause  string   is  used,
  3917. depending on the value of n. When n is absent, its value is taken  from the
  3918. argument list (as though 'v'  had been used.) The last clause is treated as
  3919. an  "otherwise"  clause if  a  colon modifier  is  used in  its  leading ~;
  3920. command. The second form  is ~:[clauset~;clausenil~]. The next argument  is
  3921. examined  (but not  consumed),  and if  nil  clausenil is  used,  otherwise
  3922. clauset is  used. The third form  is ~@[string~]. If then  next argument is
  3923. non-nil, then it is  not used up and  the format string is used,  otherwise
  3924. the argument is used up and the string is not used.
  3925.  
  3926. For ~*, the full form is ~n*. The count, n, defaults to 1 and is the number
  3927. of  arguments to  skip. If the  colon modifier  is used,  n is  negated and
  3928. skipping  is backwards. The @ modifier causes  n to be an absolute argument
  3929. position  (with default  of 0),  where the  first argument  is argument  0.
  3930. Attempts to position before  the first argument will position at  the first
  3931. argument, while attempts  to position  after the last  argument signals  an
  3932. error.
  3933.  
  3934. For ~T, the full form is:
  3935.  
  3936.      ~count,tabwidth@T
  3937.  
  3938. The  cursor is  moved  to column  "count"  (default 1).  If  the cursor  is
  3939. initially at count or beyond, then the  cursor is moved forward to the next
  3940. position that is a multiple of "tabwidth" (default 1) columns beyond count.
  3941. When the @ modifier  is used, then positioning is relative.  "count" spaces
  3942. are  printed, then additional spaces are  printed to make the column number
  3943. be a multiple of "tabwidth". Note that column calcuations will be incorrect
  3944. if ASCII tab characters or ANSI cursor positioning sequences are used.
  3945.  
  3946. For ~\n,  if the  colon  modifier is  used, then  the  format directive  is
  3947. ignored (allowing embedded returns in the source for enhanced readability).
  3948. If  the at-sign modifier  is used, then  a carriage return  is emitted, and
  3949. following whitespace is ignored. 
  3950.  
  3951.  
  3952.  
  3953.  
  3954. XLISP 2.1g                   FILE I/O FUNCTIONS                     Page 78
  3955.  
  3956.  
  3957.  
  3958. FILE I/O FUNCTIONS
  3959.  
  3960. Note  that initially, when starting XLISP-PLUS, there are six system stream
  3961. symbols which are associated with three streams. *TERMINAL-IO* is a special
  3962. stream  that  is  bound  to  the  keyboard  and  display,  and  allows  for
  3963. interactive  editing. *STANDARD-INPUT*  is bound  to standard  input  or to
  3964. *TERMINAL-IO*  if not  redirected. *STANDARD-OUTPUT*  is bound  to standard
  3965. output or to *TERMINAL-IO* if not redirected. *ERROR-OUTPUT* (error message
  3966. output),  *TRACE-OUTPUT* (for  TRACE  and TIME  functions), and  *DEBUG-IO*
  3967. (break loop i/o,  and messages)  are all bound  to *TERMINAL-IO*.  Standard
  3968. input and output can be redirected on most systems.
  3969.  
  3970. File streams  are printed using the  #< format that  cannot be read  by the
  3971. reader.  Console, standard input,  standard output, and  closed streams are
  3972. explicitly  indicated. Other file streams  will typically indicate the name
  3973. of the attached file.
  3974.  
  3975. When the transcript is active (either -t on the command line or the DRIBBLE
  3976. function),  all  characters  that   would  be  sent  to  the   display  via
  3977. *TERMINAL-IO* are also placed in the transcript file.
  3978.  
  3979. *TERMINAL-IO*  should not  be changed.  Any other  system streams  that are
  3980. changed by an application should be restored to their original values.
  3981.  
  3982. (read-char [<stream>[<eofp>[<eof>]]])        READ A CHARACTER FROM A STREAM
  3983.      NOTE: New eof arguments are incompatible with older XLISP versions.
  3984.      <stream>  the input stream (default, or NIL, is *standard-input*, T is
  3985.                *terminal-io*)
  3986.      <eofp>    When  T, signal  an error  on end  of file, when  NIL return
  3987.                <eof> (default is T)
  3988.      <eof>     the value to return on end of file (default is NIL)
  3989.      returns   the character or <eof> at end of file
  3990.  
  3991. (peek-char [<flag> [<stream>]])                  PEEK AT THE NEXT CHARACTER
  3992.      <flag>    flag for skipping white space (default is NIL)
  3993.      <stream>  the input stream (default, or NIL, is *standard-input*, T is
  3994.                *terminal-io*)
  3995.      returns   the character or NIL at end of file
  3996.  
  3997. (write-char <ch> [<stream>])                  WRITE A CHARACTER TO A STREAM
  3998.      <ch>      the character to write
  3999.      <stream>  the output stream (default,  or NIL, is *standard-output*, T
  4000.                is *terminal-io*)
  4001.      returns   the character
  4002.  
  4003. (read-line [<stream>[<eofp>[<eof>]]])             READ A LINE FROM A STREAM
  4004.      NOTE: New eof arguments are incompatible with older XLISP versions.
  4005.      <stream>  the input stream (default, or NIL, is *standard-input*, T is
  4006.                *terminal-io*)
  4007.      <eofp>    When  T, signal  an error  on end of  file, when  NIL return
  4008.                <eof> (default is T)
  4009.      <eof>     the value to return on end of file (default is NIL)
  4010.      returns   the string excluding the #\newline, or <eof> at end of file
  4011.  
  4012.  
  4013.  
  4014.  
  4015. XLISP 2.1g                   FILE I/O FUNCTIONS                     Page 79
  4016.  
  4017.  
  4018. (open <fname> &key :direction :element-type :if-exists :if-does-not-exist)
  4019.                                                          OPEN A FILE STREAM
  4020.      The function OPEN has been significantly enhanced over original XLISP.
  4021.      The original function only had the  :direction keyword argument, which
  4022.      could only  have  the values  :input or  :output. When  used with  the
  4023.      :output keyword, it was equivalent to (open <fname> :direction :output
  4024.      :if-exists :supersede). A maximum of ten files can be open  at any one
  4025.      time, including any files open via the LOAD, DRIBBLE, SAVE and RESTORE
  4026.      commands. The open command  may force a garbage collection  to reclaim
  4027.      file slots used by unbound file streams.
  4028.  
  4029.      <fname>        the file  name string,  symbol, or file  stream created
  4030.                     via OPEN. In the last case, the name is used  to open a
  4031.                     second stream  on  the  same  file --  this  can  cause
  4032.                     problems if one or more streams is used for writing.
  4033.      :direction     Read  and  write  permission  for  stream  (default  is
  4034.                     :input).
  4035.        :input       Open file for read operations only.
  4036.        :probe       Open file for reading,  then close it (use to  test for
  4037.                     file existance)
  4038.        :output      Open file for write operations only.
  4039.        :io          Like :output, but reading also allowed.
  4040.      :element-type  FIXNUM or CHARACTER (default is CHARACTER), as returned
  4041.                     by  type-of function  (on page  87). Files  opened with
  4042.                     type FIXNUM  are binary  files instead of  ascii, which
  4043.                     means no  crlf to/from  lf conversion takes  place, and
  4044.                     control-Z will not terminate an  input file. It is  the
  4045.                     intent  of  Common  Lisp  that  binary  files  only  be
  4046.                     accessed  with  read-byte  and write-byte  while  ascii
  4047.                     files be  accessed with any function  but read-byte and
  4048.                     write-byte. XLISP does not enforce that distinction.
  4049.      :if-exists     action  to take  if file  exists. Argument  ignored for
  4050.                     :input (file is positioned at start) or :probe (file is
  4051.                     closed)
  4052.        :error       give error message
  4053.        :rename      rename file to generated backup  name, then open a  new
  4054.                     file of the original name. This is the default action
  4055.        :new-version same as :rename
  4056.        :overwrite   file is positioned to start, original data intact
  4057.        :append      file is positioned to end
  4058.        :supersede   delete original file and open new file of the same name
  4059.        :rename-and-delete  same as :supersede
  4060.        NIL          close file and return NIL
  4061.      :if-does-not-exist    action to take if file does not exist.
  4062.        :error       give error  message (default for :input,  or :overwrite
  4063.                     or :append)
  4064.        :create      create  a new file (default for :output or :io when not
  4065.                     :overwrite or :append)
  4066.        NIL          return NIL (default for :probe)
  4067.      returns        a file stream, or sometimes NIL
  4068.  
  4069.  
  4070.  
  4071.  
  4072. XLISP 2.1g                   FILE I/O FUNCTIONS                     Page 80
  4073.  
  4074.  
  4075. (close <stream>)                                        CLOSE A FILE STREAM
  4076.      The stream becomes a  "closed stream." Note that unbound  file streams
  4077.      are closed automatically during a garbage collection.
  4078.      <stream>  the stream, which may be a string stream
  4079.      returns   t  if stream closed, NIL  if terminal (cannot  be closed) or
  4080.                already closed.
  4081.  
  4082. (delete-file <fname>)                                         DELETE A FILE
  4083.      <fname>   file name string, symbol or a stream opened with OPEN
  4084.      returns   t  if file  does not exist  or is  deleted. If  <fname> is a
  4085.                stream,  the stream is closed before the file is deleted. An
  4086.                error occurs if the file cannot be deleted.
  4087.  
  4088. (truename <fname>)                                OBTAIN THE FILE PATH NAME
  4089.      <fname>   file name string, symbol, or a stream opened with OPEN
  4090.      returns   string  representing the  true file  name (absolute  path to
  4091.      file).
  4092.  
  4093. (with-open-file (<var> <fname> [<karg>...]) [<expr>...])
  4094.                                                       EVALUATE USING A FILE
  4095.      Defined in common.lsp  as a  macro. File  will always  be closed  upon
  4096.      completion
  4097.      <var>     symbol name to bind  stream to while evaluating expresssions
  4098.                (quoted)
  4099.      <fname>   file name string or symbol
  4100.      <karg>    keyword arguments for the implicit open command
  4101.      <expr>    expressions to evaluate while file is open (implicit progn)
  4102.      returns   value of last <expr>.
  4103.  
  4104. (read-byte [<stream>[<eofp>[<eof>]]])             READ A BYTE FROM A STREAM
  4105.      NOTE: New eof arguments are incompatible with older XLISP versions.
  4106.      <stream>  the input stream (default, or NIL, is *standard-input*, T is
  4107.                *terminal-io*)
  4108.      <eofp>    When T,  signal an  error on end  of file,  when NIL  return
  4109.                <eof> (default is T)
  4110.      <eof>     the value to return on end of file (default is NIL)
  4111.      returns   the byte (integer) or <eof> at end of file
  4112.  
  4113. (write-byte <byte> [<stream>])                     WRITE A BYTE TO A STREAM
  4114.      <byte>    the byte to write (integer)
  4115.      <stream>  the output stream (default,  or NIL, is *standard-output*, T
  4116.                is *terminal-io*)
  4117.      returns   the byte (integer)
  4118.  
  4119. (file-length <stream>)                                   GET LENGTH OF FILE
  4120.      For  an ascii file, the length reported  may be larger than the number
  4121.      of characters read or written because of CR conversion.
  4122.      <stream>  the file stream (should be disk file)
  4123.      returns   length of file, or NIL if cannot be determined.
  4124.  
  4125.  
  4126.  
  4127.  
  4128. XLISP 2.1g                   FILE I/O FUNCTIONS                     Page 81
  4129.  
  4130.  
  4131. (file-position <stream> [<expr>])                  GET OR SET FILE POSITION
  4132.      For an ascii file, the file position may not be the same as the number
  4133.      of characters read  or written  because of CR  conversion. It will  be
  4134.      correct  when using  file-position to  position a  file at  a location
  4135.      earlier reported by file-position.
  4136.      <stream>  the file stream (should be a disk file)
  4137.      <expr>    desired  file position,  if  setting position.  Can also  be
  4138.                :start for start of file or :end for end of file.
  4139.      returns   if  setting position,  and  successful, then  T; if  getting
  4140.                position and successful then the position; otherwise NIL
  4141.  
  4142.  
  4143.  
  4144.  
  4145. XLISP 2.1g                STRING STREAM FUNCTIONS                   Page 82
  4146.  
  4147.  
  4148.  
  4149. STRING STREAM FUNCTIONS
  4150.  
  4151. These  functions  operate  on unnamed  streams.  An  unnamed output  stream
  4152. collects characters  sent to it when it  is used as the  destination of any
  4153. output function. The functions 'get-output-stream' string and list return a
  4154. sting or list of the characters.
  4155.  
  4156. An  unnamed  input  stream  is setup  with  the  'make-string-input-stream'
  4157. function  and returns each character of  the string when it  is used as the
  4158. source of any input function.
  4159.  
  4160. Note that  there is no difference between unnamed input and output streams.
  4161. Unnamed input streams may be written  to by output functions, in which case
  4162. the characters are appended to  the tail end of the stream.  Unnamed output
  4163. streams  may also be (destructively) read by  any input function as well as
  4164. the get-output-stream functions.
  4165.  
  4166. (make-string-input-stream <str> [<start> [<end>]])
  4167.      <str>     the string
  4168.      <start>   the starting offset
  4169.      <end>     the ending offset + 1 or NIL for end of string
  4170.      returns   an unnamed stream that reads from the string
  4171.  
  4172. (make-string-output-stream)
  4173.      returns   an unnamed output stream
  4174.  
  4175. (get-output-stream-string <stream>)
  4176.      The output stream is emptied by this function
  4177.      <stream>  the output stream
  4178.      returns   the output so far as a string
  4179.  
  4180. (get-output-stream-list <stream>)
  4181.      The output stream is emptied by this function
  4182.      <stream>  the output stream
  4183.      returns   the output so far as a list
  4184.  
  4185. (with-input-from-string (<var> <str> &key :start :end :index) [<expr>...])
  4186.      Defined in common.lsp as a macro
  4187.      <var>     symbol  that   stream  is  bound  to   during  execution  of
  4188.                expressions (quoted)
  4189.      <str>     the string
  4190.      :start    starting offset into string (default 0)
  4191.      :end      ending offset + 1  (default, or NIL, is end of string)
  4192.      :index    setf  place form which  gets final  index into  string after
  4193.                last expression is executed (quoted)
  4194.      <expr>    expressions to evaluate (implicit progn)
  4195.      returns   the value of the last <expr>
  4196.  
  4197. (with-output-to-string (<var>) [<expr>...])
  4198.      Defined in common.lsp as a macro
  4199.      <var>     symbol  that   stream  is  bound  to   during  execution  of
  4200.                expressions (quoted)
  4201.      <expr>    expressions to evaluate (implicit progn)
  4202.      returns   contents of stream, as a string
  4203.  
  4204.  
  4205.  
  4206.  
  4207. XLISP 2.1g              DEBUGGING AND ERROR HANDLING                Page 83
  4208.  
  4209.  
  4210.  
  4211. DEBUGGING AND ERROR HANDLING FUNCTIONS
  4212.  
  4213. (trace [<sym>...])                         ADD A FUNCTION TO THE TRACE LIST
  4214.      fsubr
  4215.      <sym>     the function(s) to add (quoted)
  4216.      returns   the trace list
  4217.  
  4218. (untrace [<sym>...])                  REMOVE A FUNCTION FROM THE TRACE LIST
  4219.      fsubr. If no functions given, all functions are removed from the trace
  4220.      list.
  4221.      <sym>     the function(s) to remove (quoted)
  4222.      returns   the trace list
  4223.  
  4224. (error <emsg> {<arg>})                       SIGNAL A NON-CORRECTABLE ERROR
  4225.      Note  that the definition  of this function has  changed from 2.1e and
  4226.      earlier so to match Common Lisp.
  4227.      <emsg>    the error message string, which is processed by FORMAT
  4228.      <arg>     optional argument{s} for FORMAT 
  4229.      returns   never returns
  4230.  
  4231. (cerror <cmsg> <emsg> {<arg>})                   SIGNAL A CORRECTABLE ERROR
  4232.      Note that the definition  of this function  has changed from 2.1e  and
  4233.      earlier so to match Common Lisp.
  4234.      <cmsg>    the continue message string, which is processed by FORMAT
  4235.      <emsg>    the error message string, which is processed by FORMAT
  4236.      <arg>     optional argument(s) for both FORMATs (arguments are useable
  4237.                twice)
  4238.      returns   NIL when continued from the break loop
  4239.  
  4240. (break <bmsg> {<arg>})                                   ENTER A BREAK LOOP
  4241.      Note that the  definition of this function  has changed from 2.1e  and
  4242.      earlier so to match Common Lisp.
  4243.      <bmsg>    the break message string, which is processed by FORMAT
  4244.      <arg>     optional argument(s) for FORMAT
  4245.      returns   NIL when continued from the break loop
  4246.  
  4247. (clean-up)                                          CLEAN-UP AFTER AN ERROR
  4248.      returns   never returns
  4249.  
  4250. (top-level)             CLEAN-UP AFTER AN ERROR AND RETURN TO THE TOP LEVEL
  4251.      Runs  the function in  variable *top-level-loop*  (ususally TOP-LEVEL-
  4252. LOOP)
  4253.      returns   never returns
  4254.  
  4255. (continue)                                CONTINUE FROM A CORRECTABLE ERROR
  4256.      returns   never returns
  4257.  
  4258. (errset <expr> [<pflag>])                                       TRAP ERRORS
  4259.      fsubr
  4260.      <expr>    the expression to execute
  4261.      <pflag>   flag to control printing of the error message (default t)
  4262.      returns   the value of  the last expression consed with NIL  or NIL on
  4263.                error
  4264.  
  4265.  
  4266.  
  4267.  
  4268. XLISP 2.1g              DEBUGGING AND ERROR HANDLING                Page 84
  4269.  
  4270.  
  4271. (baktrace [<n>])                   PRINT N LEVELS OF TRACE BACK INFORMATION
  4272.      <n>       the number of levels (defaults to all levels)
  4273.      returns   NIL
  4274.  
  4275. (evalhook <expr> <ehook> <ahook> [<env>])               EVALUATE WITH HOOKS
  4276.      <expr>    the expression to evaluate.  <ehook> is not used at  the top
  4277.                level.
  4278.      <ehook>   the value for *evalhook*
  4279.      <ahook>   the value for *applyhook*
  4280.      <env>     the  environment (default  is NIL). The  format is  a dotted
  4281.                pair of value (car)  and function (cdr) binding lists.  Each
  4282.                binding  list is a list  of level binding  a-lists, with the
  4283.                innermost a-list  first. The level binding a-list associates
  4284.                the bound symbol with its value.
  4285.      returns   the result of evaluating the expression
  4286.  
  4287. (applyhook <fun> <arglist> <ehook> <ahook>)                APPLY WITH HOOKS
  4288.      <fun>     The function closure. <ahook> is not used  for this function
  4289.                application.
  4290.      <arglist> The list of arguments.
  4291.      <ehook>   the value for *evalhook*
  4292.      <ahook>   the value for *applyhook*
  4293.      returns   the result of applying <fun> to <arglist>
  4294.  
  4295. (debug)                                                 ENABLE DEBUG BREAKS
  4296. (nodebug)                                              DISABLE DEBUG BREAKS
  4297.      Defined in init.lsp
  4298.  
  4299.  
  4300.  
  4301.  
  4302. XLISP 2.1g                    SYSTEM FUNCTIONS                      Page 85
  4303.  
  4304.  
  4305.  
  4306. SYSTEM FUNCTIONS
  4307.  
  4308. (load <fname> &key :verbose :print)                      LOAD A SOURCE FILE
  4309.      An  implicit ERRSET exists  in this function  so that  if error occurs
  4310.      during  loading, and *breakenable* is NIL, then the error message will
  4311.      be printed and  NIL will  be returned. The  OS environmental  variable
  4312.      XLPATH is  used as a  search path for  files in this  function. If the
  4313.      filename  does not contain path  separators ('/' for  UNIX, and either
  4314.      '/' or  '\' for MS-DOS) and  XLPATH is defined, then  each pathname in
  4315.      XLPATH is tried in turn until a matching file is found.  If no file is
  4316.      found,  then one last  attempt is made  in the current  directory. The
  4317.      pathnames are separated by either a space or semicolon, and a trailing
  4318.      path separator character is optional.
  4319.      <fname>   the filename string,  symbol, or a file stream  created with
  4320.                OPEN. The extension "lsp" is assumed.
  4321.      :verbose  the verbose flag (default is t)
  4322.      :print    the print flag (default is NIL)
  4323.      returns   t if successful, else NIL
  4324.  
  4325. (restore <fname>)                             RESTORE WORKSPACE FROM A FILE
  4326.      The OS  environmental variable XLPATH  is used  as a  search path  for
  4327.      files in this function. See the note under function "load", above. The
  4328.      standard  system streams  are  restored to  the  defaults as  of  when
  4329.      XLISP-PLUS  was started. Files streams  are restored in  the same mode
  4330.      they were created, if possible, and  are positioned where they were at
  4331.      the time of the  save. If the files  have been altered or moved  since
  4332.      the time  of the save, the restore  will not be completely successful.
  4333.      Memory  allocation will  not be  the same as  the current  settings of
  4334.      ALLOC are  used. Execution  proceeds at the  top-level read-eval-print
  4335.      loop. The  state of  the transcript  logging is  not affected  by this
  4336.      function.
  4337.      <fname>   the filename string,  symbol, or a file stream  created with
  4338.                OPEN. The extension "wks" is assumed.
  4339.      returns   NIL on failure, otherwise never returns
  4340.  
  4341. (save <fname>)                                     SAVE WORKSPACE TO A FILE
  4342.      You cannot save from within a load.  Not all of the state may be saved
  4343.      -- see "restore", above. By saving a workspace with the  name "xlisp",
  4344.      that  workspace   will  be   loaded  automatically  when   you  invoke
  4345.      XLISP-PLUS.
  4346.      <fname>   the filename string,  symbol, or a file stream  created with
  4347.                OPEN. The extension "wks" is assumed.
  4348.      returns   t if workspace was written, NIL otherwise
  4349.  
  4350. (savefun <fcn>)                                     SAVE FUNCTION TO A FILE
  4351.      defined in init.lsp
  4352.      <fcn>     function name (saves it to file of same name, with extension
  4353.                ".lsp")
  4354.      returns   t if successful
  4355.  
  4356. (dribble [<fname>])            CREATE A FILE WITH A TRANSCRIPT OF A SESSION
  4357.      <fname>   file name string, symbol, or file stream created with OPEN
  4358.                (if missing, close current transcript)
  4359.      returns   t if the transcript is opened, NIL if it is closed
  4360.  
  4361.  
  4362.  
  4363.  
  4364. XLISP 2.1g                    SYSTEM FUNCTIONS                      Page 86
  4365.  
  4366.  
  4367. (gc)                                               FORCE GARBAGE COLLECTION
  4368.      returns   NIL
  4369.  
  4370. (expand [<num>])                           EXPAND MEMORY BY ADDING SEGMENTS
  4371.      <num>     the number of segments to add, default 1
  4372.      returns   the number of segments added
  4373.  
  4374. (alloc <num> [<num2>])                                  CHANGE SEGMENT SIZE
  4375.      <num>     the number of nodes to allocate
  4376.      <num2>    the  number  of pointer  elements  to allocate  in  an array
  4377.                segment (when dynamic array allocation compiled). Default is
  4378.                no change.
  4379.      returns   the old number of nodes to allocate
  4380.  
  4381. (room)                                    SHOW MEMORY ALLOCATION STATISTICS
  4382.      Statistics (which are sent to *STANDARD-OUTPUT*) include:
  4383.                Nodes - number of nodes, free and used
  4384.                Free nodes - number of free nodes
  4385.                Segments - number of node segments, including those reserved
  4386.                          for characters and small integers.
  4387.                Allocate  -  number of  nodes to  allocate  in any  new node
  4388.                          segments
  4389.                Total  - total  memory  bytes allocated  for node  segments,
  4390.                          arrays, and strings
  4391.                Collections - number of garbage collections
  4392.                Time  -  time  spent  performing   garbage  collections  (in
  4393.                seconds)
  4394.      When dynamic  array allocation  is compiled, the  following additional
  4395.      statistics are printed:
  4396.                Vector  nodes  - number  of  pointers  in arrays  and  (size
  4397.                          equivalent) strings
  4398.                Vector free - free  space in vector area (may  be fragmented
  4399.                          across segments)
  4400.                Vector  segs  - number  of  vector  segments. Increases  and
  4401.                          decreases as needed.
  4402.                Vec allocate - number of pointer elements to allocate in any
  4403.                          new vector segment
  4404.      returns   NIL
  4405.  
  4406. (time <expr>)                                        MEASURE EXECUTION TIME
  4407.      fsubr.
  4408.      <expr>    the expression to evaluate
  4409.      returns   the result of  the expression. The execution time is printed
  4410.                to *TRACE-OUTPUT*
  4411.  
  4412. (get-internal-real-time)                             GET ELAPSED CLOCK TIME
  4413. (get-internal-run-time)                          GET ELAPSED EXECUTION TIME
  4414.      returns   integer      time      in       system      units       (see
  4415.                internal-time-units-per-second  on  page  23).   meaning  of
  4416.                absolute values is system dependent.
  4417.  
  4418.  
  4419.  
  4420.  
  4421. XLISP 2.1g                    SYSTEM FUNCTIONS                      Page 87
  4422.  
  4423.  
  4424. (coerce <expr> <type>)                  FORCE EXPRESSION TO DESIGNATED TYPE
  4425.      Sequences  can  be  coerced  into other  sequences,  single  character
  4426.      strings or  symbols with  single character  printnames can  be coerced
  4427.      into characters, fixnums  can be coerced  into characters or  flonums.
  4428.      Ratios can be coerced into flonums. Flonums and  ratios can be coerced
  4429.      into complex (so can fixnums, but they turn back into fixnums).
  4430.      <expr>    the expression to coerce
  4431.      <type>    desired type, as returned by type-of (see page 87)
  4432.      returns   <expr> if type is correct, or converted object.
  4433.  
  4434. (type-of <expr>)                         RETURNS THE TYPE OF THE EXPRESSION
  4435.      It is recommended that typep  be used instead, as it is  more general.
  4436.      In the original XLISP, the value NIL was returned for NIL.
  4437.      <expr>    the expression to return the type of
  4438.      returns   One of the symbols:
  4439.                LIST                for NIL (lists, conses return CONS)
  4440.                SYMBOL              for symbols
  4441.                OBJECT              for objects
  4442.                CONS                for conses
  4443.                SUBR                for built-in functions
  4444.                FSUBR               for special forms
  4445.                CLOSURE             for defined functions
  4446.                STRING              for strings
  4447.                FIXNUM              for integers
  4448.                RATIO               for ratios
  4449.                FLONUM              for floating point numbers
  4450.                COMPLEX             for complex numbers
  4451.                CHARACTER           for characters
  4452.                FILE-STREAM         for file pointers
  4453.                UNNAMED-STREAM      for unnamed streams
  4454.                ARRAY               for arrays
  4455.                HASH-TABLE          for hash tables
  4456.                sym                 for structures of type "sym"
  4457.  
  4458. (peek <addrs>)                                 PEEK AT A LOCATION IN MEMORY
  4459.      <addrs>   the address to peek at (integer)
  4460.      returns   the value at the specified address (integer)
  4461.  
  4462. (poke <addrs> <value>)                             POKE A VALUE INTO MEMORY
  4463.      <addrs>   the address to poke (integer)
  4464.      <value>   the value to poke into the address (integer)
  4465.      returns   the value
  4466.  
  4467. (address-of <expr>)                        GET THE ADDRESS OF AN XLISP NODE
  4468.      <expr>    the node
  4469.      returns   the address of the node (integer)
  4470.  
  4471. (get-key)                                     READ A KEYSTROKE FROM CONSOLE
  4472.      OS dependent.
  4473.      returns   integer value of key (no echo)
  4474.  
  4475.  
  4476.  
  4477.  
  4478. XLISP 2.1g                    SYSTEM FUNCTIONS                      Page 88
  4479.  
  4480.  
  4481. (system <command>)                                 EXECUTE A SYSTEM COMMAND
  4482.      OS dependent -- not always available.
  4483.      <command> Command string, if 0 length then spawn OS shell
  4484.      returns   T if successful (note that MS/DOS command.com always returns
  4485.                success)
  4486.  
  4487. (set-stack-mark <size>)                      SET SYSTEM STACK WARNING POINT
  4488.      OS  dependent --  not  always available.  The  system will  perform  a
  4489.      continuable  error when the  amount of  remaining system  stack passes
  4490.      below this setting. The trap is reset  at the top-level. This function
  4491.      is useful for debugging runaway recursive functions.
  4492.      <size>    Remaining stack,  in bytes.  Minimum value  is fixed  at the
  4493.                value that causes the system stack overflow error, while the
  4494.                maximum value is limitied to somewhat less than  the current
  4495.                remaining stack space. Use "0" to turn the warnings off.
  4496.      returns   the previous value.
  4497.  
  4498. (top-level-loop)                                     DEFAULT TOP LEVEL LOOP
  4499.      Runs  the XLISP  top  level read-eval-print  loop, described  earlier.
  4500.      Never returns.
  4501.  
  4502. (reset-system)                                          FLUSH INPUT BUFFERS
  4503.      Used by user-implemented top level loops to flush the input buffer
  4504.      returns   NIL
  4505.  
  4506. (exit)                                                           EXIT XLISP
  4507.      returns   never returns
  4508.  
  4509. (generic <expr>)              CREATE A GENERIC TYPED COPY OF THE EXPRESSION
  4510.      Note: added function, Tom Almy's creation for debugging xlisp.
  4511.      <expr>    the expression to copy
  4512.      returns   NIL if  value is NIL  and NILSYMBOL  compilation option  not
  4513.                declared, otherwise if type is:
  4514.                SYMBOL              copy as an ARRAY
  4515.                OBJECT              copy as an ARRAY
  4516.                CONS                (CONS (CAR <expr>)(CDR <expr>))
  4517.                CLOSURE             copy as an ARRAY
  4518.                STRING              copy of the string
  4519.                FIXNUM              value
  4520.                FLONUM              value
  4521.                RATIO               value
  4522.                CHARACTER           value
  4523.                UNNAMED-STREAM      copy as a CONS
  4524.                ARRAY               copy of the array
  4525.                COMPLEX             copy as an ARRAY
  4526.                HASH-TABLE          copy as an ARRAY
  4527.                structure           copy as an ARRAY
  4528.  
  4529. (eval-when <condition> <body> ...)
  4530.      Macro  defined in common.lsp, and provided to assist in porting Common
  4531.      Lisp applications to XLISP-PLUS.
  4532.      <condition>         List of conditions
  4533.      <body>    expressions which are evaluated if  one of the conditions is
  4534.                EXECUTE or LOAD.
  4535.      returns   result of last body expression
  4536.  
  4537.  
  4538.  
  4539.  
  4540. XLISP 2.1g                    SYSTEM FUNCTIONS                      Page 89
  4541.  
  4542.  
  4543. The following graphic and  display functions represent an extension  by Tom
  4544. Almy:
  4545.  
  4546. (cls)                                                         CLEAR DISPLAY
  4547.      Clear the display and position cursor at upper left corner.
  4548.      returns   nil
  4549.  
  4550. (cleol)                                                CLEAR TO END OF LINE
  4551.      Clears current line to end.
  4552.      returns   nil
  4553.  
  4554. (goto-xy [<column> <row>])                       GET OR SET CURSOR POSITION
  4555.      Cursor   is  repositioned   if  optional   arguments   are  specified.
  4556.      Coordinates are clipped to actual size of display.
  4557.      <column>  0-based column (x coordinate)
  4558.      <row>     0-based row (y coordinate)
  4559.      returns   list of original column and row positions
  4560.  
  4561. (color <value>)                                           SET DRAWING COLOR
  4562.      <value>   Drawing color (not checked for validity)
  4563.      returns   <value>
  4564.  
  4565. (move <x1> <y1> [<x2> <y2> ...])                              ABSOLUTE MOVE
  4566. (moverel <x1> <y2> [<x2> <y2> ...])                           RELATIVE MOVE
  4567.      For moverel, all coordinates are relative to the preceeding point.
  4568.      <x1> <y1> Moves to point x1,y1 in anticipation of draw.
  4569.      <x2> <y2> Draws to points specified in additional arguments.
  4570.      returns   T if succeeds, else NIL
  4571.  
  4572. (draw [<x1> <y1> ...])                                        ABSOLUTE DRAW
  4573. (drawrel [<x1> <y1> ...])                                     RELATIVE DRAW
  4574.      For drawrel, all coordinates are relative to the preceeding point.
  4575.      <x1> <y1> Point(s) drawn to, in order.
  4576.      returns   T if succeeds, else NIL
  4577.  
  4578.  
  4579.  
  4580.  
  4581. XLISP 2.1g                    SYSTEM FUNCTIONS                      Page 90
  4582.  
  4583.  
  4584. (mode <ax> [<bx> <width> <height>)                         SET DISPLAY MODE
  4585.      Standard modes  require only <ax> argument. Extended modes are "Super-
  4586.      VGA"  or  "Super-EGA" and  are display  card  specific. Not  all XLISP
  4587.      versions support all modes.
  4588.      <ax>      Graphic mode (value passed in register AX)
  4589.                Common standard Modes:
  4590.                0,1 - 40x25 text
  4591.                2,3 - 80x25 text
  4592.                4,5 - 320x200 4 color graphics (CGA)
  4593.                6 - 640x200 monchrome graphics (CGA)
  4594.                13 - 320x200 16 color graphics (EGA)
  4595.                14 - 640x200 16 color graphics (EGA)
  4596.                16 - 640x350 16 color graphics (EGA)
  4597.                18 - 640x480 16 color graphics (VGA)
  4598.                19 - 320x200 256 color graphics (VGA)
  4599.      <bx>      BX value for some extended graphic modes
  4600.      <width>   width for extended graphic modes
  4601.      <height>  height for extended graphic modes
  4602.      returns   a  list of  the number  of columns,  number of lines  (1 for
  4603.                CGA), maximum  X graphic coordinate (-1 for text modes), and
  4604.                the maximum Y graphic coordinate (-1 for text modes), or NIL
  4605.                if fails
  4606.  
  4607.  
  4608.  
  4609.  
  4610. XLISP 2.1g                  ADDITIONAL FUNCTIONS                    Page 91
  4611.  
  4612.  
  4613.  
  4614. ADDITIONAL FUNCTIONS AND UTILITIES
  4615.  
  4616. STEP.LSP
  4617.  
  4618. This file  contains a simple Lisp  single-step debugger. It   started as an
  4619. implementation  of the  "hook" example  in chapter  20 of  Steele's "Common
  4620. Lisp". This version was brought up on Xlisp 1.7 for the Amiga, and  then on
  4621. VAXLISP.
  4622.  
  4623. When  the package  feature is  compiled in,  the debugger  is in  the TOOLS
  4624. package. 
  4625.  
  4626. To invoke: (step (whatever-form with args))
  4627.  
  4628. For  each  list   (interpreted  function  call),  the  stepper  prints  the
  4629. environment and the list, then enters a read-eval-print loop. At this point
  4630. the available commands are:
  4631.  
  4632. (a list)<CR>   evaluate  the list  in  the current  environment, print  the
  4633.                result, and repeat.
  4634. <CR>           step into the called function
  4635. anything_else<CR>        step over the called function.
  4636.  
  4637. If the stepper comes to a  form that is not a  list it prints the form  and
  4638. the value, and continues on without stopping.
  4639.  
  4640. Note that stepper commands  are executed in the current  environment. Since
  4641. this  is the case, the stepper commands can change the current environment.
  4642. For example,  a SETF will change an environment variable and thus can alter
  4643. the course of execution.
  4644.  
  4645. Global variables - newline, *hooklevel*
  4646.  
  4647. Functions/macros - while step eval-hool-function step-spaces step-flush
  4648.  
  4649. Note -- an even more powerful  stepper package is in stepper.lsp (documented
  4650. in stepper.doc).
  4651.  
  4652.  
  4653.  
  4654.  
  4655. XLISP 2.1g                  ADDITIONAL FUNCTIONS                    Page 92
  4656.  
  4657.  
  4658. PP.LSP
  4659.  
  4660. In  addition to  the  pretty-printer  itself,  this  file  contains  a  few
  4661. functions that illustrate some simple but useful applications.
  4662.  
  4663. When the  package feature is compiled  in, these funtions are  in the TOOLS
  4664. package.
  4665.  
  4666. (pp <object> [<stream>])                            PRETTY PRINT EXPRESSION
  4667. (pp-def <funct> [<stream>])                     PRETTY PRINT FUNCTION/MACRO
  4668. (pp-file <file> [<stream>])                               PRETTY PRINT FILE
  4669.      <object>  The expression to print
  4670.      <funct>   Function to print (as DEFUN or DEFMACRO)
  4671.      <file>    File to print (specify either as string or quoted symbol)
  4672.      <stream>  Output stream (default is *standard-output*)
  4673.      returns   T
  4674.  
  4675. Global variables: tabsize maxsize miser-size min-miser-car max-normal-car
  4676.  
  4677. Functions/Macros: sym-function pp-file pp-def make-def pp pp1 moveto spaces
  4678. pp-rest-across     pp-rest    printmacrop     pp-binding-form    pp-do-form
  4679. pp-defining-form pp-pair-form
  4680.  
  4681. See the source file for more information.
  4682.  
  4683.  
  4684.  
  4685.  
  4686. XLISP 2.1g                  ADDITIONAL FUNCTIONS                    Page 93
  4687.  
  4688.  
  4689. INSPECT.LSP
  4690.  
  4691. INSPECT..LSP contains  an XLISP editor/inspector. When  the package feature
  4692. is compiled in, the editor is in the TOOLS package.
  4693.  
  4694. Execute
  4695.      (ins  'symbol) to edit a symbol.
  4696.      (insf  symbol)  to  edit the  function  binding  of  a symbol  (allows
  4697.                changing  the  argument list  or  function  type, lambda  or
  4698.                macro).
  4699.  
  4700. The  editor alters the  current selection by  copying so that  aborting all
  4701. changes is generally posible; the  exception is when editing a  closure, if
  4702. the closure is  backed out  of, the change  is permanent. Also,  naturally,
  4703. changing the values  of structure elements, instance variables,  or symbols
  4704. cannot be undone.
  4705.  
  4706. For  all commands  taking  a numeric  argument,  the first  element  of the
  4707. selection is the 0th (as in NTH function).
  4708.  
  4709. Do  not create  new closures,  because the  environment will  be incorrect.
  4710. Closures  become LAMBDA  or MACRO  expressions as  the selection.  Only the
  4711. closure  body  may be  changed; the  argument  list cannot  be successfully
  4712. modified, nor can the environment.
  4713.  
  4714. For class  objects, the class variables,  methods and message names  can be
  4715. modified.  For instance objects, instance variables can be examined (if the
  4716. object  under-stands  the message  :<ivar>  for the  particular  ivar), and
  4717. changed (if :SET-IVAR is defined for that class, as it is if CLASSES.LSP is
  4718. used). Structure elements can be examined and changed. 
  4719.  
  4720. (command list on next page)
  4721.  
  4722.  
  4723.  
  4724.  
  4725. XLISP 2.1g                  ADDITIONAL FUNCTIONS                    Page 94
  4726.  
  4727.  
  4728. COMMANDS (all "hot keyed and case sensitive"):
  4729.      ?         List available commands
  4730.      A         select the CAR of the current selection.
  4731.      D         select the CDR of the current selection.
  4732.      e n       select ("Edit") element n
  4733.      r n x     Replaces element n with  x.
  4734.      X         eXit, saving all changes
  4735.      Q         Quit, without saving changes
  4736.      b         go Back one level (backs up A, D or e commands)
  4737.      B n       go Back n levels.
  4738.      l         List selection  using pprint;  if selection is  symbol, give
  4739.                short description
  4740.      v         Verbosity toggle
  4741.      . n       change maximum print length (default 10)
  4742.       # n      change maximum print depth (default 3)
  4743.      ! x       evaluates  x and prints result,  the symbol tools:@ is bound
  4744.                to the selection
  4745.      R x       Replaces the selection with  evaluated x, the symbol tools:@
  4746.                is bound to the selection
  4747.  
  4748. ADDITIONAL COMMANDS  (selection is a list or array):
  4749.      ( n m     inserts parenthesis starting  with the nth  element,  for  m
  4750.                elements.
  4751.       ) n      removes  parenthesis surrounding  nth element  of selection,
  4752.                which may be array or list
  4753.      [ n m     as in (, but makes elements into an array
  4754.      i n x     Inserts x before nth element in selection.
  4755.      d n       Deletes nth element in selection.
  4756.      S x y     Substitute all  occurances of y  with x in  selection (which
  4757.                must be a list).  EQUAL is used for the comparison.
  4758.  
  4759.  
  4760.  
  4761.  
  4762. XLISP 2.1g                BUG FIXES AND EXTENSIONS                  Page 95
  4763.  
  4764.  
  4765.  
  4766. BUG FIXES AND EXTENSIONS
  4767.  
  4768.  
  4769. In this section, CL means "Common Lisp compatible  to the extent possible".
  4770. CX  means  "now works  with  complex numbers".  CR  means  "now works  with
  4771. ratios".  *  means   "implemented  in   LISP  rather  than   C".  #   means
  4772. "implementation moved from LISP to C".
  4773.  
  4774.                                  Bug Fixes
  4775.  
  4776. RESTORE did  not work -- several  bugs for 80x86 systems.  Only one restore
  4777. would work per session -- all systems.
  4778.  
  4779. :downcase for variable *printcase* did not work with some compilers.
  4780.  
  4781. Modifications to make the source acceptable to ANSI C compilers.
  4782.  
  4783. Values for ADEPTH  and EDEPTH changed to  more reasonable values  -- before
  4784. this change the processor stack would overflow first, causing a crash.
  4785.  
  4786. On systems  with 16 bit  integers: STRCAT  crashes when  aggregate size  of
  4787. argument strings  were greater than  32k. MAKE-ARRAY  crashes on  too-large
  4788. arrays.    DOTIMES,   AREF,   AREF   and   NTH   place   forms   of   SETF,
  4789. MAKE-STRING-INPUT-STREAM    and   GET-OUTPUT-STREAM-STRING  treat   numeric
  4790. argument  modulo  65536.   MAKE-STRING-INPUT-STREAM  did   not  check   for
  4791. start>end.
  4792.  
  4793. Strings containing nulls could not be read or printed.
  4794.  
  4795. NTH and NTHCDR failed for zero length lists.
  4796.  
  4797. Unnamed streams did not survive garbage collections.
  4798.  
  4799. (format nil ...) did not protect from garbage collection the unnamed stream
  4800. it creates.
  4801.  
  4802. SORT did not protect some pointers from garbage collection.
  4803.  
  4804. SYMBOL-NAME SYMBOL-VALUE SYMBOL-PLIST BOUNDP and FBOUNDP failed with symbol
  4805. NIL as argument.
  4806.  
  4807. LAST returned wrong value when its argument list ended with a dotted pair.
  4808.  
  4809. *gc-hook*  was  not rebound  to NIL  during  execution of  gchook function,
  4810. causing potential infinite recursion and crash.
  4811.  
  4812. Executing RETURN from within a DOLIST  or DOTIMES caused the environment to
  4813. be wrong.
  4814.  
  4815. When errors occured during  loading, which were not caught,  the file would
  4816. be  left open.  EVAL and  LOAD did  not use global  environment. EVALHOOK's
  4817. default environment was not global.
  4818.  
  4819.  
  4820.  
  4821.  
  4822. XLISP 2.1g                BUG FIXES AND EXTENSIONS                  Page 96
  4823.  
  4824.  
  4825. Invalid symbols (those containing control characters, for instance), can no
  4826. longer be created with intern and make-symbol.
  4827.  
  4828. The key T, meaning  "otherwise" in the CASE function used  to be allowed in
  4829. any position. Now it only means "otherwise" when used as the last case.
  4830.  
  4831. The  lexical and functional environment of send of :answer (which defines a
  4832. new method) are  now used during the  method's evaluation, rather  than the
  4833. global environment.
  4834.  
  4835. Signatures added for WKS files so that invalid ones will be rejected.
  4836.  
  4837. Checks added for file names and identifier names being too long.
  4838.  
  4839. Indexing code fixed to allow almost 64k long strings  in 16 bit systems. It
  4840. is no longer possible  to allocate arrays or strings that are  too long for
  4841. the underlying system.
  4842.  
  4843. Circularity  checks added  to  PRINT LAST  BUTLAST  LENGTH MEMBER  and  MAP
  4844. functions. An  error is  produced for  all but  MEMBER, which  will execute
  4845. correctly.
  4846.  
  4847. Code for  SETF modified so that  a Common Lisp compatible  DEFSETF could be
  4848. used.
  4849.  
  4850. Circularity checks added to EQUAL.
  4851.  
  4852. Check for  even number of arguments  to SETQ, SETF, and  PSETQ added. PSETQ
  4853. changed to return NIL rather than result of first assignment (really now!).
  4854.  
  4855.  
  4856.                            User Interface Changes
  4857.  
  4858. -w command line argument to specify alternate or no workspace.
  4859.  
  4860. -b command line argument for batch operation.
  4861.  
  4862. -? command line argument gives usage message.
  4863.  
  4864. init.lsp not loaded if workspace loaded.
  4865.  
  4866. Search path can be provided for workspaces and .lsp files.
  4867.  
  4868. Standard input  and output  can be  redirected. *TERMINAL-IO*  stream added
  4869. which is always bound to console (stderr).
  4870.  
  4871. Non-error  messages   are  sent  to   *DEBUG-IO*  so  they   don't  clutter
  4872. *STANDARD-OUTPUT*
  4873.  
  4874. Results of evaluations are printed  on a fresh line rather than at  the end
  4875. of the preceeding line (if any). This enhances readability.
  4876.  
  4877. Display writes are buffered.
  4878.  
  4879. Character literals available for all 256 values. CL
  4880.  
  4881.  
  4882.  
  4883.  
  4884. XLISP 2.1g                BUG FIXES AND EXTENSIONS                  Page 97
  4885.  
  4886.  
  4887. Uninterned symbols print with leading #:. CL
  4888.  
  4889. PRIN1  generates   appropriate  escape  sequences  for   control  and  meta
  4890. characters in strings. CL
  4891.  
  4892. Read macro #. added. CL
  4893.  
  4894. Lisp code for nested backquote macros added. CL
  4895.  
  4896. Read macro #C added for complex numbers. CL
  4897.  
  4898. Semantics  for #S  read macro  changed so  that it  can read  in structures
  4899. written by PRINT. CL
  4900.  
  4901. PRINT of file streams shows file name, or "closed" if a closed file stream.
  4902.  
  4903. *PRINT-CASE* now applies to PRINC. CL
  4904.  
  4905. Added *READTABLE-CASE*  to control  case  conversion on  input and  output,
  4906. allowing case sensitive code. CL-like
  4907.  
  4908. Reader macros #+ and #- added, along with global variable *FEATURES*. CL
  4909.  
  4910. Added optional and  OS dependent  checking of system  stack overflow,  with
  4911. checks  in READ,  PRINT, EVAL, and  in the  garbage collector.  Added a new
  4912. function  SET-STACK-MARK  which  performs  a  continuable  error  when  the
  4913. remaining stack space drops below a preset amount.
  4914.  
  4915. Improved  command line  editing, symbol  name lookup, and  history (command
  4916. recall) for MS-DOS.
  4917.  
  4918. *PRINT-CASE* can now be :CAPITALIZE. CL
  4919.  
  4920. Packages added.
  4921.  
  4922.                            New/Changed Data Types
  4923.  
  4924. NIL -- was treated as a special case, now just a normal symbol.
  4925. symbols -- value binding can optionally be constant or special. "*unbound*"
  4926.      is no longer a symbol so does not have to be specially treated.
  4927. ratio numbers -- new type.
  4928. complex numbers -- new type, can be integer or real.
  4929. character strings -- The ASCII NUL (code 0) is now a valid character.
  4930. objects -- objects of class Class have a new instance variable which is the
  4931.      print name of the class.
  4932. hash-table -- new type, close to CL
  4933. random-state -- new type, CL
  4934. Property list properties are no longer limited to just symbols CL
  4935. Multiple value returns added where appropriate
  4936. Packages added where appropriate
  4937.  
  4938.                         New Variables and Constants
  4939.  
  4940. *apply-hook* Now activated
  4941. *command-line*
  4942.  
  4943.  
  4944.  
  4945.  
  4946. XLISP 2.1g                BUG FIXES AND EXTENSIONS                  Page 98
  4947.  
  4948.  
  4949. *displace-macros* Macros  are replaced with their  expansions when possible
  4950.      *dos-input* MSDOS  only, uses  DOS interface  to  interact with  user.
  4951.      Allows recall of earlier command(s).
  4952. *load-file-arguments*
  4953. *print-level* CL
  4954. *print-length* CL
  4955. *random-state* CL
  4956. *ratio-format*
  4957. *readtable-case* CL-like
  4958. *startup-functions*
  4959. *terminal-io* CL
  4960. *top-level-loop*
  4961. internal-time-units-per-second CL
  4962. pi CL
  4963.  
  4964.  
  4965.                                New functions
  4966.  
  4967. ACONS CL*
  4968. ACOSH CL*
  4969. ADJOIN CL
  4970. ALPHA-CHAR-P CL
  4971. APPLYHOOK CL
  4972. APROPOS CL*
  4973. APROPOS-LIST CL*
  4974. ASH CL
  4975. ASINH CL*
  4976. ATANH CL*
  4977. BUTLAST CL
  4978. CEILING CL
  4979. CIS CL*
  4980. CLREOL (clear to end of line -- MS/DOS only)
  4981. CLRHASH CL
  4982. CLS (clear screen -- MS/DOS only)
  4983. COERCE CL
  4984. COLOR (graphics -- MS/DOS only)
  4985. COMPLEMENT CL
  4986. COMPLEX CL
  4987. COMPLEXP CL
  4988. CONCATENATE CL
  4989. CONJUGATE CL
  4990. CONSTANTP CL
  4991. COPY-ALIST CL*
  4992. COPY-LIST CL*
  4993. COPY-TREE CL*
  4994. COSH CL*
  4995. COUNT-IF CL except no :from-end
  4996. DECF CL*
  4997. DECLARE *
  4998. DEFCLASS * (define a new class)
  4999. DEFINST * (define a new instance)
  5000. DEFMETHOD * (define a new method)
  5001. DEFPACKAGE CL*
  5002. DEFSETF CL*
  5003. DELETE-FILE CL
  5004.  
  5005.  
  5006.  
  5007.  
  5008. XLISP 2.1g                BUG FIXES AND EXTENSIONS                  Page 99
  5009.  
  5010.  
  5011. DELETE-PACKAGE CL
  5012. DENOMINATOR CL
  5013. DO-ALL-SYMBOLS CL*
  5014. DO-EXTERNAL-SYMBOLS CL*
  5015. DO-SYMBOLS CL*
  5016. DRAW (graphics -- MS/DOS only)
  5017. DRAWREL (graphics -- MS/DOS only)
  5018. ELT CL
  5019. EQUALP CL*
  5020. EVAL-WHEN *
  5021. EVERY CL
  5022. EXPORT CL
  5023. FILE-LENGTH CL
  5024. FILE-POSITION CL
  5025. FILL CL*
  5026. FIND-ALL-SYMBOLS CL
  5027. FIND-IF CL except no :from-end
  5028. FIND-PACKAGE CL
  5029. FLOOR CL
  5030. FRESH-LINE CL
  5031. FUNCTIONP CL*
  5032. GENERIC (implementation debugging function)
  5033. GET-INTERNAL-REAL-TIME CL
  5034. GET-INTERNAL-RUN-TIME CL
  5035. GETF CL
  5036. GETHASH CL
  5037. GOTO-XY (position cursor -- MS/DOS only)
  5038. HASH-TABLE-COUNT CL
  5039. IDENTITY CL
  5040. IMAGPART CL
  5041. IMPORT CL
  5042. INCF CL*
  5043. IN-PACKAGE CL
  5044. INPUT-STREAM-P CL
  5045. INTERSECTION CL
  5046. LCM CL
  5047. LIST* CL
  5048. LIST-ALL-PACKAGES CL
  5049. LIST-LENGTH CL
  5050. LOG CL
  5051. LOGTEST CL*
  5052. MAKE-HASK-TABLE CL
  5053. MAKE-PACKAGE CL
  5054. MAKE-RANDOM-STATE CL
  5055. MAP CL
  5056. MAP-INTO CL
  5057. MAPHASH CL
  5058. MARK-AS-SPECIAL
  5059. MODE (graphics -- MS/DOS only)
  5060. MOVE (graphics -- MS/DOS only)
  5061. MOVEREL (graphics -- MS/DOS only)
  5062. MULTIPLE-VALUE-BIND CL*
  5063. MULTIPLE-VALUE-CALL CL
  5064. MULTIPLE-VALUE-LIST CL*
  5065. MULTIPLE-VALUE-PROG1 CL
  5066.  
  5067.  
  5068.  
  5069.  
  5070. XLISP 2.1g                BUG FIXES AND EXTENSIONS                 Page 100
  5071.  
  5072.  
  5073. MULTIPLE-VALUE-SETQ CL*
  5074. NINTERSECTION CL*
  5075. NTH-VALUE
  5076. NOTANY CL
  5077. NOTEVERY CL
  5078. NREVERSE CL
  5079. NSET-DIFFERENCE CL*
  5080. NSET-EXCLUSIVE-OR CL*
  5081. NSTRING-CAPITALIZE CL
  5082. NUMERATOR CL
  5083. NUNION CL*
  5084. OPEN-STREAM-P CL
  5085. OUTPUT-STREAM-P CL
  5086. PACKAGE-NAME CL
  5087. PACKAGE-NICKNAMES CL
  5088. PACKAGE-OBARRAY
  5089. PACKAGE-SHADOWING-SYMBOLS CL
  5090. PACKAGE-USED-BY-LIST CL
  5091. PACKAGE-USE-LIST CL
  5092. PACKAGE-VALID-P
  5093. PAIRLIS CL*
  5094. PHASE CL
  5095. POP CL*
  5096. POSITION-IF CL except no :from-end
  5097. PROCLAIM *
  5098. PSETF CL
  5099. PUSH CL*
  5100. PUSHNEW CL*
  5101. RATIONAL CL
  5102. RATIONALP CL
  5103. REALPART CL
  5104. REDUCE CL except no :from-end
  5105. REMF CL*
  5106. REMHASH CL
  5107. REMOVE-DUPLICATES CL except no :from-end
  5108. RENAME-PACKAGE CL
  5109. REPLACE CL*
  5110. RESET-SYSTEM
  5111. ROUND CL
  5112. SEARCH CL except no :from-end
  5113. SET-DIFFERENCE CL
  5114. SET-EXCLUSIVE-OR CL*
  5115. SET-STACK-MARK
  5116. SETF Placeform ELT  CL
  5117. SETF Placeform GETF CL
  5118. SETF Placeform GETHASH  CL
  5119. SETF Placeform SEND* (set instance variable)
  5120. SHADOW CL
  5121. SHADOWING-IMPORT CL
  5122. SIGNUM CL*
  5123. SINH CL*
  5124. SOME CL
  5125. SPECIALP CL
  5126. STRING-CAPITALIZE CL
  5127. SUBSETP CL
  5128.  
  5129.  
  5130.  
  5131.  
  5132. XLISP 2.1g                BUG FIXES AND EXTENSIONS                 Page 101
  5133.  
  5134.  
  5135. SYMBOL-PACKAGE CL
  5136. TANH CL*
  5137. TIME CL
  5138. TOP-LEVEL-LOOP
  5139. TRUENAME CL
  5140. TYPEP CL
  5141. UNEXPORT CL
  5142. UNINTERN CL*
  5143. UNION CL
  5144. UNUSE-PACKAGE CL
  5145. USE-PACKAGE CL
  5146. VALUES CL
  5147. VALUES-LIST CL
  5148. WITH-INPUT-FROM-STRING CL*
  5149. WITH-OPEN-FILE CL*
  5150. WITH-OUTPUT-TO-STRING CL*
  5151. Y-OR-N-P CL*
  5152. YES-OR-NO-P CL*
  5153.  
  5154.  
  5155.                              Changed functions
  5156.  
  5157. &ALLOW-OTHER-KEYS CL (now functions, is no longer ignored)
  5158. :ALLOW-OTHER-KEYS CL
  5159. * CL CR CX (with no arguments, returns 1)
  5160. + CL CR CX (with no arguments, returns 0)
  5161. - CL CR CX
  5162. / CL CR CX
  5163. 1+ CL CR CX
  5164. 1- CL CR CX
  5165. ABS CL CR CX
  5166. ACOS CL CR CX
  5167. ALLOC (new optional second argument)
  5168. APPLY CL (allows multiple arguments)
  5169. AREF CL (now works on strings)
  5170. ASIN CL CR CX
  5171. ASSOC CL (added :key)
  5172. ATAN CL CR CX (second argument now allowed)
  5173. BREAK CL
  5174. CERROR CL
  5175. CHAR-CODE CL (parity bit is stripped)
  5176. CLOSE CL (will close unnamed stream strings)
  5177. COS CL CR CX
  5178. DEFCONSTANT CL# (true constants)
  5179. DEFPARAMETER CL# (true special variables)
  5180. DEFSTRUCT (added option :print-function, comment field)
  5181. DEFVAR CL# (true special variables)
  5182. DELETE (added keywords :key :start :end. Works on arrays and strings)
  5183. DELETE-IF (added keywords :key :start :end. Works on arrays and strings) 
  5184. DELETE-IF-NOT  (added  keywords  :key  :start  :end.  Works  on arrays  and
  5185.      strings)
  5186. ERROR CL
  5187. EXP CL CR CX
  5188. EXPT CL CR CX
  5189. FMAKUNBOUND #
  5190.  
  5191.  
  5192.  
  5193.  
  5194. XLISP 2.1g                BUG FIXES AND EXTENSIONS                 Page 102
  5195.  
  5196.  
  5197. FORMAT  (added directives # ~D ~E ~F  ~G ~O ~X ~& ~* ~?  ~| ~( ~[ ~{ ~T ~\N
  5198.      and lowercase directives) 
  5199. GET CL
  5200. HASH (hashes everything, not just symbols or strings)
  5201. LOAD CL (uses path to find file, allows file stream for name argument) 
  5202. LOGAND CL (with no arguments, returns -1)
  5203. LOGIOR CL (with no arguments, returns 0)
  5204. LOGXOR CL (with no arguments returns 0)
  5205. MAKE-ARRAY (added keywords :initial-contents and :initial-element)
  5206. MAKE-STRING-INPUT-STREAM CL (:end NIL means end of string)
  5207. MAKUNBOUND #
  5208. MAPCAN #
  5209. MAPCON #
  5210. MEMBER CL (added :key)
  5211. NSTRING-DOWNCASE CL (string  argument can be symbol, :end NIL  means end of
  5212.      string)
  5213. NSTRING-UPCASE CL (string  argument can be  symbol, :end NIL  means end  of
  5214.      string)
  5215. NSUBLIS CL
  5216. NSUBST CL
  5217. NSUBST-IF CL
  5218. NSUBST-IF-NOT CL
  5219. OPEN CL (many additional options, as in Common Lisp)
  5220. PEEK (fixnum sized location is fetched)
  5221. PEEK-CHAR CL (input stream NIL is *standard-input*, T is *terminal-io*) 
  5222. POKE (fixnum sized location is stored)
  5223. PPRINT (output stream NIL is *standard-output*, T is *terminal-io*)
  5224. PRIN1 CL (output stream NIL is *standard-output*, T is *terminal-io*)
  5225. PRINC CL (output stream NIL is *standard-output*, T is *terminal-io*)
  5226. PRINT (output stream NIL is *standard-output*, T is *terminal-io*)
  5227. RANDOM CL (works with random-states)
  5228. READ  (input  stream  NIL  is  *standard-input*,  T  is *terminal-io*,  eof
  5229.      arguments)
  5230. READ-BYTE CL (input stream NIL is *standard-input*, T is *terminal-io*, eof
  5231.      arguments) 
  5232. READ-CHAR CL (input stream NIL is *standard-input*, T is *terminal-io*, eof
  5233.      arguments) 
  5234. READ-LINE CL (input stream NIL is *standard-input*, T is *terminal-io*, eof
  5235.      arguments) 
  5236. REM CR CL (only two arguments now allowed, may be floating point)
  5237. REMOVE (added keywords :key :start :end. Works on arrays and strings)
  5238. REMOVE-IF (added keywords :key :start :end. Works on arrays and strings) 
  5239. REMOVE-IF-NOT  (added  keywords :key  :start  :end.  Works  on  arrays  and
  5240.      strings) 
  5241. RESTORE (uses path to find file, restores file streams, fine name  argument
  5242.      may be file stream)
  5243. REVERSE CL (works on arrays and strings)
  5244. ROUND CL (rounds to nearest even)
  5245. SAVE (file name argument may be file stream)
  5246. SIN CL CR CX
  5247. SORT (added :key) CL (with most compilers)
  5248. SQRT CL CR CX
  5249. STRCAT * (now a macro, use of CONCATENATE is recommended)
  5250. STRING-comparisonFunctions CL (string arguments can be symbols)
  5251.  
  5252.  
  5253.  
  5254.  
  5255. XLISP 2.1g                BUG FIXES AND EXTENSIONS                 Page 103
  5256.  
  5257.  
  5258. STRING-DOWNCASE CL (string argument  can be symbol,  :end NIL means end  of
  5259.      string)
  5260. STRING-LEFT-TRIM CL (string argument can be symbol)
  5261. STRING-RIGHT-TRIM CL (string argument can be symbol)
  5262. STRING-TRIM CL (string argument can be symbol)
  5263. STRING-UPCASE  CL (string  argument can be  symbol, :end  NIL means  end of
  5264.      string) 
  5265. SUBLIS CL (modified to do minimum copying)
  5266. SUBSEQ CL (works on arrays and lists)
  5267. SUBST CL (modified to do minimum copying)
  5268. TAN CL CR CX
  5269. TERPRI CL (output stream NIL is *standard-output*, T is *terminal-io*) 
  5270. TRUNCATE CR CL (allows denominator argument)
  5271. TYPE-OF  (returns HASH-TABLE for hashtables, COMPLEX  for complex, and LIST
  5272.      for NIL)
  5273. UNTRACE CL (with no arguments, untraces all functions)
  5274. VALUES CL
  5275. VALUES-LIST CL
  5276. WRITE-BYTE CL (output stream NIL is *standard-output*, T is *terminal-io*)
  5277. WRITE-CHAR CL (output stream NIL is *standard-output*, T is *terminal-io*)
  5278.  
  5279.  
  5280.                        New messages for class Object
  5281.  
  5282. :prin1 <stream>
  5283. :superclass *
  5284. :ismemberof <cls> *
  5285. :iskindof <cls> *
  5286. :respondsto <selector> * 
  5287. :storeon (returns form that will create a copy of the object) *
  5288.  
  5289.                         New messages for class Class
  5290.  
  5291. :superclass *
  5292. :messages *
  5293. :storeon (returns form that will recreate class and methods) *
  5294.  
  5295.  
  5296.  
  5297.  
  5298. XLISP 2.1g                        EXAMPLES                         Page 104
  5299.  
  5300.  
  5301.  
  5302. EXAMPLES: FILE I/O FUNCTIONS
  5303.  
  5304.  
  5305. Input from a File
  5306.  
  5307. To open a file for  input, use the OPEN function with  the keyword argument
  5308. :DIRECTION set to :INPUT. To open a file for output, use the OPEN  function
  5309. with  the keyword  argument :DIRECTION  set to  :OUTPUT. The  OPEN function
  5310. takes  a single  required  argument which  is the  name of  the file  to be
  5311. opened. This  name can be  in the form  of a string  or a symbol.  The OPEN
  5312. function returns an object  of type FILE-STREAM  if it succeeds in  opening
  5313. the specified  file. It  returns the value  NIL if  it fails.  In order  to
  5314. manipulate the file, it is necessary to save the value returned by the OPEN
  5315. function. This is usually done by assigning it to  a variable with the SETQ
  5316. special form or by binding it using LET or LET*. Here is an example:
  5317.  
  5318.     (setq fp (open "init.lsp" :direction :input))
  5319.  
  5320. Evaluating this expression will result in the file "init.lsp" being opened.
  5321. The file object that will be returned by the OPEN function will be assigned
  5322. to the variable "fp".
  5323.  
  5324. It is now  possible to use the  file for input. To read  an expression from
  5325. the file,  just supply  the  value of  the "fp"  variable  as the  optional
  5326. "stream" argument to READ.
  5327.  
  5328.     (read fp)
  5329.  
  5330. Evaluating this expression will result in reading the first expression from
  5331. the  file "init.lsp". The expression will be  returned as the result of the
  5332. READ function. More  expressions can be  read from  the file using  further
  5333. calls to the READ function. When there are no more expressions to read, the
  5334. READ function will give an error (or if a second nil argument is specified,
  5335. will return  nil or whatever  value was supplied  as the third  argument to
  5336. READ).
  5337.  
  5338. Once you are done reading from the  file, you should close it. To close the
  5339. file, use the following expression:
  5340.  
  5341.     (close fp)
  5342.  
  5343. Evaluating this expression will cause the file to be closed.
  5344.  
  5345.  
  5346.  
  5347.  
  5348. XLISP 2.1g                        EXAMPLES                         Page 105
  5349.  
  5350.  
  5351.  
  5352. Output to a File
  5353.  
  5354. Writing to a file is pretty much the same  as reading from one. You need to
  5355. open the file first. This time you should use the OPEN function to indicate
  5356. that you will do output to the file. For example:
  5357.  
  5358.     (setq fp (open "test.dat" :direction :output :if-exists :supersede))
  5359.  
  5360. Evaluating this expression will open the file "test.dat" for output. If the
  5361. file already exists, its current contents will be discarded.  If it doesn't
  5362. already exist, it will be  created. In any case, a FILE-STREAM  object will
  5363. be returned by the OPEN function. This file object will be assigned  to the
  5364. "fp" variable.
  5365.  
  5366. It is now possible to write to this file by supplying the value of the "fp"
  5367. variable as the optional "stream" parameter in the PRINT function.
  5368.  
  5369.     (print "Hello there" fp)
  5370.  
  5371. Evaluating  this expression will result  in the string  "Hello there" being
  5372. written to the file "test.dat".  More data can be written to the file using
  5373. the same technique.
  5374.  
  5375. Once you  are done  writing to the  file, you should  close it.  Closing an
  5376. output file is just like closing an input file.
  5377.  
  5378.     (close fp)
  5379.  
  5380. Evaluating  this  expression  will  close  the  output  file  and  make  it
  5381. permanent.
  5382.  
  5383.  
  5384.  
  5385. A Slightly More Complicated File Example
  5386.  
  5387. This example shows how to  open a file, read each Lisp expression  from the
  5388. file and  print it. It  demonstrates the  use of files  and the use  of the
  5389. optional "stream" argument to the READ
  5390. function.
  5391.  
  5392.     (do* ((fp (open "test.dat" :direction :input))
  5393.           (ex (read fp nil) (read fp nil)))
  5394.          ((null ex) (close fp) nil)
  5395.       (print ex))
  5396.  
  5397. The file will be closed with the next garbage collection.
  5398.  
  5399.  
  5400.  
  5401.  
  5402. XLISP 2.1g                         INDEX                           Page 106
  5403.  
  5404.  
  5405. INDEX
  5406.  
  5407.  
  5408. :allow-other-keys  17                   :start  40-43, 55, 56, 81
  5409. :answer  21                             :start1  40, 43, 56
  5410. :append  79                             :start2  40, 43, 56
  5411. :capitalize  14                         :storeon  20, 21
  5412. :class  20                              :superclass  20, 21
  5413. :conc-name  59                          :supersede  79
  5414. :constituent  12                        :test       29,   37,   40-43,
  5415. :create  79                                       45-47, 65
  5416. :direction  79                          :test-not        29,    40-43,
  5417. :downcase  14                                     45-47, 65
  5418. :element-type  79                       :tmacro  12
  5419. :end  40-43, 55, 56, 81                 :upcase  14
  5420. :end1  40, 43, 56                       :use  33
  5421. :end2  40, 43, 56                       :verbose  85
  5422. :error  79                              :white-space  12
  5423. :external  30, 33                       +  24, 49
  5424. :if-does-not-exist  79                  ++  24
  5425. :if-exists  79                          +++  24
  5426. :include  59                            -  24, 50
  5427. :inherited  30, 33                      *  24, 50
  5428. :initial-contents  38                   **  24
  5429. :initial-element  38                    ***  24
  5430. :initial-value  43                      *applyhook*  8, 23
  5431. :input  79                              *breakenable*  4, 23
  5432. :internal  30, 33                       *command-line*  24
  5433. :invert  14                             *debug-io*  23
  5434. :io  79                                 *displace-macros*  7, 24
  5435. :iskindof  20                           *dos-input*  3, 24
  5436. :ismemberof  20                         *error-output*  23
  5437. :isnew  20, 21                          *evalhook*  8, 23
  5438. :key  29, 40-43, 45-48, 65              *features*  13, 24
  5439. :mescape  12                            *float-format*  24, 73
  5440. :messages  21                           *gc-flag*  23
  5441. :new  21                                *gc-hook*  8, 23
  5442. :new-version  79                        *integer-format*  24, 73
  5443. :nicknames  33                          *load-file-arguments*  2, 24
  5444. :nmacro  12                             *obarray*  23
  5445. :output  79                             *package*  23
  5446. :overwrite  79                          *print-case*  14, 24, 73
  5447. :preserve  14                           *print-length*  24, 73
  5448. :prin1  20                              *print-level*  24, 73
  5449. :print  85                              *random-state*  24
  5450. :print-function  59                     *ratio-format*  24, 73
  5451. :probe  79                              *read-suppress*  24
  5452. :rename  79                             *readtable-case*  14, 24, 73
  5453. :rename-and-delete  79                  *readtable*  12, 23
  5454. :respondsto  20                         *standard-input*  23
  5455. :sescape  12                            *standard-output*  23
  5456. :set-ivar  61                           *startup-functions*  2, 24
  5457. :set-pname  61                          *struct-slots*  59
  5458. :show  20                               *terminal-io*  23
  5459. :size  37                               *top-level-loop*  24
  5460.  
  5461.  
  5462.  
  5463.  
  5464. XLISP 2.1g                         INDEX                           Page 107
  5465.  
  5466.  
  5467. *trace-output*  23                      char  57
  5468. *tracelimit*  4, 23                     char-code  57
  5469. *tracelist*  23                         char-downcase  57
  5470. *tracenable*  4, 23                     char-equal  58
  5471. /  50                                   char-greaterp  58
  5472. /=  53                                  char-int  58
  5473. <  53                                   char-lessp  58
  5474. <=  53                                  char-not-equal  58
  5475. =  53                                   char-not-greaterp  58
  5476. >  53                                   char-not-lessp  58
  5477. >=  53                                  char-upcase  57
  5478. &allow-other-keys  17                   char/=  58
  5479. &aux  17                                char<  58
  5480. &key  17                                char<=  58
  5481. &optional  17                           char=  58
  5482. &rest  17                               char>  58
  5483. 1+  50                                  char>=  58
  5484. 1-  50                                  CHARACTER  87
  5485. abs  50                                 characterp  64
  5486. acons  44                               cis  52
  5487. acos  51                                class  23
  5488. acosh  51                               classp  64
  5489. address-of  87                          clean-up  3, 83
  5490. adjoin  47                              clean-up,  4
  5491. alloc  86                               close  80
  5492. alpha-char-p  57                        CLOSURE  87
  5493. and  66, 67                             clrhash  37
  5494. append  44                              cls  89
  5495. apply  25                               code-char  57
  5496. applyhook  8, 84                        coerce  87
  5497. apropos  32                             color  89
  5498. apropos-list  32                        comma  25
  5499. aref  28, 38                            comma-at  26
  5500. ARRAY  87                               complement  25
  5501. arrayp  64                              complex  52, 87
  5502. ash  54                                 complexp  64
  5503. asin  51                                concatenate  39
  5504. asinh  51                               cond  67
  5505. assoc  45                               conjugate  53
  5506. atan  51                                cons  44, 87
  5507. atanh  51                               consp  63
  5508. atom  63, 66                            constantp  63
  5509. backquote  25                           continue  3, 4, 83
  5510. baktrace  84                            copy-alist  46
  5511. block  71                               copy-list  46
  5512. both-case-p  57                         copy-tree  46
  5513. boundp  64                              cos  51
  5514. break  83                               cosh  51
  5515. butlast  44                             count  41
  5516. car  28, 44                             count-if  41
  5517. case  68                                count-if-not  41
  5518. catch  68                               cxxr  44
  5519. cdr  28, 44                             cxxxr  44
  5520. ceiling  49                             cxxxxr  44
  5521. cerror  83                              debug  84
  5522.  
  5523.  
  5524.  
  5525.  
  5526. XLISP 2.1g                         INDEX                           Page 108
  5527.  
  5528.  
  5529. decf  30                                find-all-symbols  33
  5530. declare  31                             find-if  41
  5531. defclass  61                            find-if-not  41
  5532. defconstant  31                         find-package  33
  5533. definst  62                             find-symbol  33
  5534. defmacro  30                            first  44
  5535. defmethod  61                           FIXNUM  87
  5536. defpackage  32                          flatc  74
  5537. defparameter  31                        flatsize  74
  5538. defsetf  29                             flet  68
  5539. defstruct  59                           float  49
  5540. defun  30                               floatp  63
  5541. defvar  31                              FLONUM  87
  5542. delete  42                              floor  49
  5543. delete-file  80                         fmakunbound  31
  5544. delete-if  42                           format  75
  5545. delete-if-not  42                       fourth  44
  5546. delete-package  32                      fresh-line  74
  5547. denominator  52                         FSUBR  87
  5548. digit-char  57                          funcall  25
  5549. digit-char-p  57                        function  25, 66
  5550. do  70                                  functionp  65
  5551. do-all-symbols  33                      gc  86
  5552. do-external-symbols  33                 gcd  51
  5553. do-symbols  33                          generic  88
  5554. do*  70                                 gensym  30
  5555. dolist  70                              get  28, 36
  5556. dotimes  70                             get-internal-real-time  86
  5557. draw  89                                get-internal-run-time  86
  5558. drawrel  89                             get-key  87
  5559. dribble  85                             get-lambda-expression  26
  5560. elt  28, 39                             get-macro-character  73
  5561. endp  63                                get-output-stream-list  82
  5562. eq  65                                  get-output-stream-string  82
  5563. eql  65                                 getf  36
  5564. equal  65                               gethash  28, 37
  5565. equalp  65                              go  71
  5566. error  83                               goto-xy  89
  5567. errset  4, 83                           hash  30
  5568. eval  25                                HASH-TABLE  87
  5569. eval-when  88                           hash-table-count  37
  5570. evalhook  8, 84                         identity  25
  5571. evenp  65                               if  67
  5572. every  39                               imagpart  52
  5573. exit  88                                import  33
  5574. exp  52                                 in-package  33
  5575. expand  86                              incf  30
  5576. export  33                              input-stream-p  64
  5577. expt  52                                int-char  58
  5578. fboundp  64                             integerp  63
  5579. file-length  80                         intern  30
  5580. file-position  81                       internal-time-units-per-second
  5581. FILE-STREAM  87                                   23
  5582. fill  43                                intersection  47
  5583. find  41                                labels  68
  5584.  
  5585.  
  5586.  
  5587.  
  5588. XLISP 2.1g                         INDEX                           Page 109
  5589.  
  5590.  
  5591. lambda  26                              NIL  23
  5592. last  44                                nintersection  47
  5593. lcm  51                                 nodebug  84
  5594. length  39                              not  63, 66
  5595. let  68                                 notany  39
  5596. let*  68                                notevery  39
  5597. list  44, 66, 87                        nreverse  39
  5598. list-all-packages  33                   nset-difference  47
  5599. list-length  44                         nset-exclusive-or  47
  5600. list*  44                               nstring-capitalize  56
  5601. listp  63                               nstring-downcase  56
  5602. load  85                                nstring-upcase  55
  5603. log  52                                 nsubst  46
  5604. logand  54                              nsubst-if  48
  5605. logior  54                              nsubst-if-not  48
  5606. lognot  54                              nth  28, 45
  5607. logtest  54                             nth-value  27
  5608. logxor  54                              nthcdr  45
  5609. loop  70                                null  63, 66
  5610. lower-case-p  57                        NUMBER  66
  5611. macroexpand  26                         numberp  63
  5612. macroexpand-1  26                       numerator  52
  5613. macrolet  68                            nunion  47
  5614. make-array  38                          object  23, 66, 87
  5615. make-hash-table  37                     objectp  64
  5616. make-package  33                        oddp  65
  5617. make-random-state  51                   open  79
  5618. make-string-input-stream  82            open-stream-p  64
  5619. make-string-output-stream  82           or  66, 67
  5620. make-symbol  30                         output-stream-p  64
  5621. makunbound  31                          package-name  34
  5622. map  39                                 package-nicknames  34
  5623. map-into  39                            package-obarray  34
  5624. mapc  45                                package-shadowingsymbols  34
  5625. mapcan  45                              package-use-list  34
  5626. mapcar  45                              package-used-by-list  34
  5627. mapcon  46                              package-valid-p  34
  5628. maphash  37                             pairlis  46
  5629. mapl  45                                peek  87
  5630. maplist  45                             peek-char  78
  5631. mark-as-special  31                     phase  53
  5632. max  50                                 pi  23
  5633. member  45, 66                          plusp  65
  5634. min  50                                 poke  87
  5635. minusp  65                              pop  29
  5636. mod  50                                 position  42
  5637. mode  90                                position-if  42
  5638. move  89                                position-if-not  42
  5639. moverel  89                             pp  92
  5640. multiple-value-bind  27                 pprint  74
  5641. multiple-value-call  27                 prin1  73
  5642. multiple-value-list  27                 princ  74
  5643. multiple-value-prog1  27                print  73
  5644. multiple-value-setq  27                 proclaim  31
  5645. nconc  48                               prog  71
  5646.  
  5647.  
  5648.  
  5649.  
  5650. XLISP 2.1g                         INDEX                           Page 110
  5651.  
  5652.  
  5653. prog*  71                               setf  28
  5654. prog1  71                               setq  28
  5655. prog2  72                               shadow  34
  5656. progn  72                               shadowing-import  34
  5657. progv  71                               signum  51
  5658. psetf  29                               sin  51
  5659. psetq  28                               sinh  51
  5660. push  29                                some  39
  5661. pushnew  29                             sort  40
  5662. putprop  36                             specialp  63
  5663. quote  25                               sqrt  52
  5664. random  51                              step  91
  5665. RATIO  87                               strcat  56
  5666. rational  49, 66                        STREAM  66
  5667. rationalp  64                           streamp  64
  5668. read  73                                string  55, 87
  5669. read-byte  80                           string-capitalize  55
  5670. read-char  78                           string-downcase  55
  5671. read-line  78                           string-equal  56
  5672. realpart  52                            string-greaterp  56
  5673. reduce  43                              string-left-trim  55
  5674. rem  50                                 string-lessp  56
  5675. remf  36                                string-not-equal  56
  5676. remhash  37                             string-not-greaterp  56
  5677. remove  40                              string-not-lessp  56
  5678. remove-duplicates  43                   string-right-trim  55
  5679. remove-if  40                           string-trim  55
  5680. remove-if-not  40                       string-upcase  55
  5681. remprop  36                             string/=  56
  5682. rename-package  34                      string<  56
  5683. repair  93                              string<=  56
  5684. repairf  93                             string=  56
  5685. replace  43                             string>  56
  5686. reset-system  88                        string>=  56
  5687. rest  44                                stringp  64
  5688. restore  85                             STRUCT  66
  5689. return  71                              sublis  46
  5690. return-from  71                         SUBR  87
  5691. reverse  39                             subseq  40
  5692. room  86                                subsetp  65
  5693. round  49                               subst  46
  5694. rplaca  48                              SYMBOL  87
  5695. rplacd  48                              symbol-function  28, 30
  5696. satisfies  66                           symbol-name  30
  5697. save  85                                symbol-package  34
  5698. search  40                              symbol-plist  28, 30
  5699. second  44                              symbol-value  28, 30
  5700. self  19, 23                            symbolp  63
  5701. send  19, 28, 61                        system  88
  5702. send-super  19, 61                      t  23
  5703. set  28                                 tagbody  71
  5704. set-difference  47                      tan  51
  5705. set-exclusive-or  47                    tanh  51
  5706. set-macro-character  73                 terpri  74
  5707. set-stack-mark  88                      third  44
  5708.  
  5709.  
  5710.  
  5711.  
  5712. XLISP 2.1g                         INDEX                           Page 111
  5713.  
  5714.  
  5715. throw  68
  5716. time  86
  5717. top-level  3, 83
  5718. top-level-loop  2, 88
  5719. trace  83
  5720. truename  80
  5721. truncate  49
  5722. type-of  87
  5723. typep  66
  5724. unexport  35
  5725. union  47
  5726. unless  67
  5727. UNNAMED-STREAM  87
  5728. untrace  83
  5729. unuse-package  35
  5730. unwind-protect  69
  5731. upper-case-p  57
  5732. use-package  35
  5733. values  27
  5734. values-list  27
  5735. vector  38
  5736. when  67
  5737. with-input-from-string  82
  5738. with-open-file  80
  5739. with-output-to-string  82
  5740. write-byte  80
  5741. write-char  78
  5742. XLPATH  85
  5743. y-or-n-p  74
  5744. yes-or-no-p  74
  5745. zerop  65
  5746.